2015-05-27 37 views
1

的問題是,我具有表示華氏單元double轉換沒有損失

var fahrenheit = 80.0; 

爲了將其轉換爲攝氏我使用公式

var celsius = (fahreheit - 32.0)/1.8; 

它給出一個數字26.666667(比方說26.67

當我將其轉換回

var fahrenheitAgain = 1.8 * celsius + 32.0; 

它提供了一個更高的數字80.006,如果我有2個小數位,則四捨五入爲80.01。但是,我如何獲得與以前相同的價值?

是否有任何已知的解決方案來將任何雙值來回轉換始終具有相同的值?

+2

無論你如何確保你在這裏選擇的數字都能正常工作,只會意味着它不適用於不同類型的數字。如果你確實有測量的溫度,那麼你需要意識到你的價值並不是真正存在的,它們是近似值,並相應地對待它們。 – Servy

+0

您也可以使用十進制而不是雙精度。但是塞維認爲這個問題仍然會出現在一些價值觀上。 – deathismyfriend

+0

我應該理解,就像沒有辦法具有相同的值? –

回答

7

(比方說26.67

讓我們不要。

您不能以「讓我們說」開始計算並期望結果準確。事實上,26.67°C是恰好是 80.006°F(沒有舍入誤差),所以從這一點開始沒有辦法獲得更精確的結果。

不要做「讓我們說」;儘可能精確地存儲結果,從顯示它們的代碼中分離出來,並且只在最後時刻輪流顯示。

仍然會有不準確之處,因爲double(或decimal或任何其他此類型)的值不能精確匹配,但您會較少受其影響,並且通常效果會獲得即使他們在那裏,也不會被看到。

+0

我的藉口不明確,通過「讓我們說」我的意思是我保留在一個字符串{0.00}格式的結果,所以我的確切值26.67從字符串解析轉換背部。 –

+0

在這種情況下,問題出現在域,而不是編程; 26.67°C是80.006°F。 –

+0

我現在明白了,謝謝! –

3

有一個數據結構只爲顯示目的進行轉換,而不是每次都進行轉換。所以你只做一次轉換。

例如

public interface ITemperature 
{ 
    double Celsius { get; } 
    double Fahrenheit { get; } 
} 


public class CelsiusTemperature : ITemperature 
{ 
    private readonly int _value; 

    public CelsiusTemperature(int value) 
    { 
     this._value = value; 
    } 

    public double Celsius 
    { 
     get { return _value; } 
    } 

    public double Fahrenheit 
    { 
     get { return 1.8 * _value + 32.0; } 
    } 
} 

public class FahrenheitTemperature : ITemperature 
{ 
    private readonly int _value; 

    public FahrenheitTemperature(int value) 
    { 
     _value = value; 
    } 

    public double Celsius 
    { 
     get { return (_value - 32.0)/1.8; } 
    } 

    public double Fahrenheit 
    { 
     get { return _value; } 
    } 
} 
2

我能看到能夠精確保留精度的唯一方法就是將值存儲爲分數。

這是假設您有數據以小數形式(即80 1/8度)開始。如果你從十進制值開始,那麼在來回轉換時不會有任何方法獲得確切的值。

快速搜索顯示了幾個實現能夠工作:

Code ProjectVisual C# Kicks