2

当我尝试将 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 btw。

我搞不清楚了。请帮忙。

4

4 回答 4

2

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

这会给你你想要的:

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

如果您需要十进制数字的完美准确性,请改用十进制类型。

于 2013-01-28T14:57:55.657 回答
1

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

var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03m*10000m)/10000m);
于 2013-01-28T14:56:49.183 回答
0

试试下面的代码......它会帮助你......

        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
于 2013-01-28T15:06:23.813 回答
0

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

如果你把数字四舍五入,你就可以避免这个问题。

于 2013-01-28T14:54:05.477 回答