当我尝试将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。
我迷路了。请帮忙。
答案 0 :(得分:2)
这里没有乘以10000并除以10000。你只冒一些轻微错误的风险,就像你在这里看到的那样:注意,double和float使用base-2表示,因此不能精确地表示任意十进制数。
这会给你你想要的东西:
String.Format("{0:#,0.0000}", 2.03)
如果您需要十进制数字的完美准确度,请改用小数类型。
答案 1 :(得分:1)
这是精确度的损失,在某些情况下并不是什么大问题。尝试使用decimal类型,如下所示:
var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03m*10000m)/10000m);
答案 2 :(得分:0)
数字2.03表示为二进制数,表示无法准确存储。这可能导致舍入错误(例如,小数点后的15位数),这些错误未被Truncate更正。
如果您对数字进行四舍五入,则可以避免此问题。
答案 3 :(得分: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