C#如何精确地将双精度转换为十进制?

时间:2019-05-17 16:25:40

标签: c# floating-point decimal precision

以下C#代码显示0.1-为什么?

var s = "0.1";
var dbl = Double.Parse(s);
var dcml = Convert.ToDecimal(dbl);
Console.WriteLine(dcml.ToString());

不是0.01不能用二进制表示,因此应该打印0.100000001490116吗?

1 个答案:

答案 0 :(得分:5)

dbl的值正好为0.1000000000000000055511151231257827021181583404541015625。

这是0.1到17个有效数字。

documentation for Convert.ToDecimal(Double)指出:

  

此方法返回的十进制值最多包含15个有效数字。如果value参数包含的有效位数超过15个,则使用舍入到最接近的值进行舍入。

conversion from Single (aka float)被记录为可以更早地截断:

  

此方法返回的十进制值最多包含七个有效数字。如果value参数包含七个以上的有效数字,则使用四舍五入到最接近的值四舍五入。

如果您使用初始转换为0.1f的值调用Convert.ToDecimal(Double),它将显示0.100000001490116:

double dbl = 0.1f;        
decimal dcml = (decimal) dbl;
Console.WriteLine(dcml);