Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 华氏温度和摄氏温度之间的转换,反之亦然,无损失_C# - Fatal编程技术网

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; }
    }
}