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 顺便说一句。
我迷路了。请帮忙。
这里没有乘以 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