C# 数学.截断返回错误的十进制截断

C# 数学.截断返回错误的十进制截断,c#,.net,C#,.net,当我尝试将4位小数(解决方案中要求的)添加到2位小数的双精度值时,发生了一件奇怪的事情: 值不正确: var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03*10000)/10000); var result = string.Format("{0:#,0.0000}", Math.Truncate(2.02*10000)/10000); var result = string.Format("{0:

当我尝试将4位小数(解决方案中要求的)添加到2位小数的双精度值时,发生了一件奇怪的事情:

值不正确:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.02*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.04*10000)/10000);
//返回2.0299

正确的值:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.02*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.04*10000)/10000);
//返回2.0200

和:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.02*10000)/10000);
    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.04*10000)/10000);
//返回2.0400

知道为什么这只发生在2.03上吗?12.03作为输入值返回12.0300 btw


我迷路了。请帮助。

数字2.03表示为二进制数,这意味着它无法准确存储。这可能会导致舍入错误(例如,小数点后的15位数字),不能通过截断进行纠正


如果对数字进行四舍五入,就可以避免问题。

这是精度损失,在某些情况下,这并不是什么大问题。尝试使用如下类型:

var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03m*10000m)/10000m);

这里没有乘以10000再除以10000的意思。您只需要冒引入微小错误的风险,就像您在这里看到的那样:请注意,double和float使用的是base-2表示法,因此无法精确表示任意十进制数

这将为您提供您想要的:

String.Format("{0:#,0.0000}", 2.03)

如果您需要十进位数字的精确性,请改用十进位类型。

请尝试以下代码。。。。它会帮助你

        var result = Decimal.Add(Convert.ToDecimal(2.03 * 10000 / 10000), .0000m);
        //Results 2.0300

        var result = Decimal.Add(Convert.ToDecimal(2.02 * 10000 / 10000), .0000m);
        //Results 2.0200

        var result = Decimal.Add(Convert.ToDecimal(2.04 * 10000 / 10000), .0000m);
        //Results 2.0400

        var result = Decimal.Add(Convert.ToDecimal(12.03 * 10000 / 10000), .0000m);
        //Results 12.0300

如果您想要固定的结果,请使用十进制,而不是双精度。double是一种近似值。任意两个浮点值之间有无限多个浮点值,但我们只有32位或64位来描述它们。根据定义,你不能用有限的精度来描述它们。这是正确的。2.03是无法用
双精度
精确表示的数字之一。谷歌快速搜索声称
2.03
的最接近值为
2.0299999999980460074766597
,这与“不正确”的值一致。您对错误原因的分析是正确的,而您提出的解决方案则不是。