C# 数学.截断返回错误的十进制截断
当我尝试将4位小数(解决方案中要求的)添加到2位小数的双精度值时,发生了一件奇怪的事情: 值不正确: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:
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
,这与“不正确”的值一致。您对错误原因的分析是正确的,而您提出的解决方案则不是。