问题是我有一个代表华氏度单位的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值以始终具有相同的值?
答案 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度)开始。如果您从十进制值开始,那么在来回转换时无法获得准确的值。
快速搜索显示了一些可能有效的实现:
上