Math.Truncate 返回不正确的小数截断

本文关键字:小数 不正确 Truncate 返回 Math | 更新日期: 2023-09-27 17:56:15

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

值不正确:

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

返回 2.0299

正确的值:

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

返回 2.0200

和:

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

返回 2.0400

知道为什么这只发生在 2.03 上吗? 12.03 作为输入值返回 12.0300 顺便说一句。

我迷路了。请帮忙。

Math.Truncate 返回不正确的小数截断

这里没有乘以 10000 和除以 10000 的意义。您只会冒引入轻微错误的风险,就像您在这里看到的那样:请注意,双精度和浮点数使用以 2 为底的表示形式,因此不能精确地表示任意十进制数。

这将给你你想要的:

String.Format("{0:#,0.0000}", 2.03)
如果需要十进制

数字的完美精度,请改用十进制类型。

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

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

数字 2.03 表示为二进制数,这意味着它不能精确存储。这可能会导致舍入错误(例如,小数点后 15 位数字),而 Truncate 无法更正这些错误。

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

试试下面的代码....它将帮助您...

        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