C# 华氏温度和摄氏温度之间的转换,反之亦然,无损失
问题是我有一个表示华氏单位的C# 华氏温度和摄氏温度之间的转换,反之亦然,无损失,c#,C#,问题是我有一个表示华氏单位的double值 var fahrenheit = 80.0; 要将其转换为摄氏度,我使用以下公式 var celsius = (fahreheit - 32.0) / 1.8; 它给出了一个数字26.66666 7(比方说26.67) 当我把它换回来的时候 var fahrenheitAgain = 1.8 * celsius + 32.0; 如果我有两个小数位,它会给出一个更高的数字80.006,四舍五入到80.01。但是我如何获得与以前相同的值呢 是否有任何
double
值
var fahrenheit = 80.0;
要将其转换为摄氏度,我使用以下公式
var celsius = (fahreheit - 32.0) / 1.8;
它给出了一个数字26.66666 7
(比方说26.67
)
当我把它换回来的时候
var fahrenheitAgain = 1.8 * celsius + 32.0;
如果我有两个小数位,它会给出一个更高的数字80.006
,四舍五入到80.01
。但是我如何获得与以前相同的值呢
是否有任何已知的解决方案来来回转换任何双精度值,使其始终具有相同的值?有一个数据结构,该结构仅用于显示目的,而不是每次转换。所以你只需要做一次转换 e、 g
我所能看到的保持精确性的唯一方法是将值存储为分数 这是假设您的数据以分数形式(即80 1/8度)开始。如果您是从十进制值开始的,那么在来回转换时将没有任何方法可以获得精确的值 快速搜索显示了两个可能有效的实现: 上 (比如说
26.67
)
别这样
你不能以“让我们说”开始计算,而期望结果是准确的。事实上,26.67°C正是80.006°F(无舍入误差),因此从这一点开始,没有可能得到更精确的结果
不要做“让我们说”;尽可能精确地存储结果,与显示结果的代码分开,并在最后一刻取整以显示结果
仍然会有不准确的地方,因为有些值不能精确地放在
double
(或decimal
或任何其他类似类型)中,但受影响的频率会降低,通常,即使存在效果,效果也根本看不到。无论你如何确保你在这里选择的数字效果良好,都只意味着对不同类型的数字效果不佳。如果你确实测量了温度,那么你需要意识到你的值在第一位实际上并不存在,它们是近似值,并据此进行处理。你也可以使用十进制而不是双精度。但正如Servy所说,对于某些值,问题仍然会出现。我是否应该理解,没有办法获得相同的值?是的。您可以始终以尽可能精确的方式存储这两个值。这将占用更多的空间,小数不能解决问题。没有普遍的解决办法。你需要理解数学,然后在释放数据之前存储所需的数据。如果你的数学是分数,那就保持分子和分母为整数。Float和double只能存储二进制数、十进制数、yup、十进制数。1/3都不是..我不清楚的借口是,“让我们说”我的意思是我将结果保存在一个{0.00}格式的字符串中,因此我确实从字符串中解析出了26.67的精确值以转换回来;26.67°C等于80.006°F。
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; }
}
}