Skip to content

double.ToString

问题

private const double doubleVal =  10.789738975897389458937485738947857349;
private const string doubleStr = "10.789738975897389458937485738947857349";

[TestMethod]
public void DoubleToString()
{
    var s = doubleVal.ToString();

    // NOT EQUAL!
    Assert.AreNotEqual(doubleStr, s);
}

在 C# 中 double 类型的数值在执行 ToString 之后损失精度。

原因

当通过 ToString 方法进行数值转换的时候,通常意味着要把这个值显示在屏幕上,因此会截断一些精度。

由“精度”引申出一个问题,在计算机中,数值本来就不精确。因为二进制的数值无法模拟连续的实数。

再回到 “double.ToString” 的问题,不考虑浮点数本身的精度损失,仅考虑传输和转换的情况,可以通过 BitConverter 将其转换为字节数组避免 ToString 的精度损失:

[TestMethod]
public void BitConverterToBytes()
{
    byte[] doubleBytes = BitConverter.GetBytes(doubleVal);

    double convertedDouble = BitConverter.ToDouble(doubleBytes, 0);

    Assert.AreEqual(doubleVal, convertedDouble);
}

Ref

Unity: dont use double tostring

0.1 + 0.2 returns 0.30000000000000004

Microsoft: BitConverter

Github: orrest/Tests