2013-06-11 2 views
0

Довольно странные вещи происходят здесь:всплывают со странными цифрами после того

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) 

Где моя ошибка? Надеюсь, ты поможешь.

+3

Это может просвещать вас: http://floating-point-gui.de/ – BlackBear

+0

Thx для ответа – Sharpnel

ответ

0

Ответ: Магазин «номер слишком много цифр» в double, вокруг него и cast его в float.

2

Нет никакой реальной ошибки, кроме вашего понимания различных типов хранилищ переменных и их точности. Я просто отвечаю на ваш вопрос, не пытаясь быть грубым.

Кроме того, вы используете int, float и double все в одном уравнении, а затем бросая все, что к decimal. Это очень плохая практика, так как все они имеют разную точность. В общем, используйте наименьший тип хранилища, который необходим, и используйте те же типы, если это абсолютно необходимо, что требует отбрасывания (неявно или явно) и изменения точности.

Ссылка BlackBear очень хорошая.

Также см эти SO ответы:
https://stackoverflow.com/a/618542/1002098
https://stackoverflow.com/a/10056298/1002098