2009-11-09 95 views
2

我使用十进制类型(.net),我想看看两个数字是否相等。但我只想精确到小数点后10位。例如,拿这三个数字。我希望他们都是平等的。如何比较两位小数到小数点后10位?

0.1123456789 
0.11234567891 
0.11234567899 

的10进制数限制是从我的数据库来了,所以我必须假设,第一个数字已经四舍五入,因此,我不能简单地圆别人,因为最后一个会总结。

我真的只想截断到10位小数,但看不到如何做到这一点。

回答

5

乘以10^10并删除小数部分怎么样?

decimal x2 = Math.Truncate(x * 10000000000); 
decimal y2 = Math.Truncate(y * 10000000000); 
Assert.Equals(x2, y2); 

编辑:由Aaron的建议更改为Math.Truncate。谢谢。

+1

当然这也将是错误的,大于2^31/10000000000. – Aaron 2009-11-09 15:01:31

+0

@Aaron任何价值的,当然。 – 2009-11-09 15:04:03

+0

将其更改为Math.Truncate()而不是转换为int - 您仍然会失去一点顶端精度,但它会更“接近”。 – Aaron 2009-11-09 15:07:33

1

乘以10000000000,转换为int,然后除以相同的数字。

这样你截断了多余的数字。

您可能需要添加.5 * 10^-11才能在截断前正确舍入。

-2

或许这对你的作品:

If Decimal.Round(yourDec1, 10, MidpointRounding.AwayFromZero) = Decimal.Round(yourDec2, 10, MidpointRounding.AwayFromZero) Then 

鲍比

+4

四舍五入!=截断。 – 2009-11-09 14:55:41

10

你比较浮点数以同样的方式。下面是一些伪代码,因为我不知道在.NET呼吁绝对值,但它基本上将看起来像这样(修改常数所需要的精确度):

if(Math.Abs(value1 - value2) < 0.0000000001) 
{ 
    // blah blah 
} 
+1

return(Math.Abs​​(value1 - value2)<= precision); – 2009-11-09 15:06:29

+1

@Russel,固定使用'Math.Abs​​'。 – 2009-11-09 15:13:02

+0

感谢您的协助。 :D – 2009-11-09 15:36:27

相关问题