添加后浮动有奇怪的数字

时间:2013-06-11 17:25:29

标签: c# precision addition primitive-types

这里发生了很奇怪的事情:

float theFloat = 10f * 0.5f * 0.0502913967f;

//result is 0.2514569835f
//but a float's precision is only 7digits so it's false.    
//I corrected it, rounded at 6digits, result is 0.251457f

float theFloat = (float)Math.Round((decimal)(10f * 0.5f * 0.0502913967f), 6);

没关系,但是当我将它用于另一个浮动时:

Vector2 theVector2 = new Vector2(16302.51f, 0f);
theVector2.X += theFloat;

//means : (16302.51 + 0.251457) = 16302.761457
//but when I check the var the result is : 16302.7607
//so I don't get it...
//also, if theVector2 is 200f more than the previous example (=16502.51f, 0f),
//result is 16502.7617 (200.001f more than previous example's result)

我的错误在哪里?希望你能帮忙。

2 个答案:

答案 0 :(得分:2)

除了理解不同的变量存储类型及其精度之外,没有其他真正的错误。我只是回答你的问题,而不是试图粗鲁。

此外,您在一个等式中使用了intfloatdouble,然后将所有这些转换为decimal。这是非常糟糕的做法,因为它们都有不同的精度。通常,使用必要的最小存储类型,并使用相同的类型,除非绝对必要,这需要强制转换(隐式或显式)和更改精度。

BlackBear的链接非常好。

另见这些答案:
https://stackoverflow.com/a/618542/1002098
https://stackoverflow.com/a/10056298/1002098

答案 1 :(得分:0)

答案是:在double中将“数字过多的数字”存储在“{1}}”中,将cast存储在float中。