我使用十进制类型(.net),我想看看两个数字是否相等。但我只想精确到小数点后10位。例如,拿这三个数字。我希望他们都是平等的。如何比较两位小数到小数点后10位?
0.1123456789
0.11234567891
0.11234567899
的10进制数限制是从我的数据库来了,所以我必须假设,第一个数字已经四舍五入,因此,我不能简单地圆别人,因为最后一个会总结。
我真的只想截断到10位小数,但看不到如何做到这一点。
我使用十进制类型(.net),我想看看两个数字是否相等。但我只想精确到小数点后10位。例如,拿这三个数字。我希望他们都是平等的。如何比较两位小数到小数点后10位?
0.1123456789
0.11234567891
0.11234567899
的10进制数限制是从我的数据库来了,所以我必须假设,第一个数字已经四舍五入,因此,我不能简单地圆别人,因为最后一个会总结。
我真的只想截断到10位小数,但看不到如何做到这一点。
乘以10^10
并删除小数部分怎么样?
decimal x2 = Math.Truncate(x * 10000000000);
decimal y2 = Math.Truncate(y * 10000000000);
Assert.Equals(x2, y2);
编辑:由Aaron的建议更改为Math.Truncate
。谢谢。
乘以10000000000,转换为int,然后除以相同的数字。
这样你截断了多余的数字。
您可能需要添加.5 * 10^-11才能在截断前正确舍入。
或许这对你的作品:
If Decimal.Round(yourDec1, 10, MidpointRounding.AwayFromZero) = Decimal.Round(yourDec2, 10, MidpointRounding.AwayFromZero) Then
鲍比
四舍五入!=截断。 – 2009-11-09 14:55:41
你比较浮点数以同样的方式。下面是一些伪代码,因为我不知道在.NET呼吁绝对值,但它基本上将看起来像这样(修改常数所需要的精确度):
if(Math.Abs(value1 - value2) < 0.0000000001)
{
// blah blah
}
return(Math.Abs(value1 - value2)<= precision); – 2009-11-09 15:06:29
@Russel,固定使用'Math.Abs'。 – 2009-11-09 15:13:02
感谢您的协助。 :D – 2009-11-09 15:36:27
乘以10^10 而不是转换为一个整数(这是32位)可能值得使用int64。一个int 32有一个大约20亿的限制,当多重输出给出的范围在你的十进制值的+2.1和-2.1之间时,int64有一个更大的范围,当乘以一个范围大约+922,000,000到 - 9.22亿的十进制值
当然这也将是错误的,大于2^31/10000000000. – Aaron 2009-11-09 15:01:31
@Aaron任何价值的,当然。 – 2009-11-09 15:04:03
将其更改为Math.Truncate()而不是转换为int - 您仍然会失去一点顶端精度,但它会更“接近”。 – Aaron 2009-11-09 15:07:33