华氏温度和摄氏温度之间的转换,反之亦然,没有任何损失

时间:2015-05-27 16:12:28

标签: c#

问题是我有一个代表华氏度单位的double

var fahrenheit = 80.0;

要将其转换为摄氏度,请使用公式

var celsius = (fahreheit - 32.0) / 1.8;

它给出了一个数字26.666667(比方说26.67

当我将其转换回来时

var fahrenheitAgain = 1.8 * celsius + 32.0;

如果我有2位小数,它会提供一个更高的数字80.006,舍入为80.01。但我如何获得与以前相同的价值?

是否有任何已知的解决方案来回转换任何double值以始终具有相同的值?

3 个答案:

答案 0 :(得分:7)

  

(让我们说26.67

我们不是。

你不能用“让我们说”开始计算,并期望结果准确。实际上,26.67°C 完全 80.006°F(没有舍入误差),因此从那一点开始就没有可能获得更精确的结果。

不要“让我们说”;尽可能精确地存储您的结果,与显示它们的代码分开,并在最后一刻进行舍入以便显示。

仍然存在不准确之处,因为有些值不能完全适合double(或decimal或任何其他此类类型),但您会受到更少的影响通常,即使它们在那里,效果也根本不可见。

答案 1 :(得分:3)

具有仅用于显示目的的转换的数据结构,而不是每次都进行转换。所以你只进行一次转换。

e.g。

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 :(得分:2)

我能够确切地看到能够精确保存精度的唯一方法是将值存储为分数。

假设您的数据以分数形式(即80 1/8度)开始。如果您从十进制值开始,那么在来回转换时无法获得准确的值。

快速搜索显示了一些可能有效的实现:

Code ProjectVisual C# Kicks