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

zvo*_*kov 1 c# floating-point precision decimal

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

var s = "0.1";
var dbl = Double.Parse(s);
var dcml = Convert.ToDecimal(dbl);
Console.WriteLine(dcml.ToString());
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 5

的值dbl正好是0.1000000000000000055511151231257827021181583404541015625。

那是0.1到17个有效数字。

对文档Convert.ToDecimal(Double)状态:

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

Single(aka float)进行转换已被记录为可以更早截断:

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

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

double dbl = 0.1f;        
decimal dcml = (decimal) dbl;
Console.WriteLine(dcml);
Run Code Online (Sandbox Code Playgroud)