2012-10-01 51 views
0

我基本上总的数量变得非常大。我正在使用float,因为我想保留精度级别,但它只能达到100k。这里是一些示例输出。变量类型的问题

x 361 y 800 width 530 h 800 intensity 93581.52477873862 
x 362 y 800 width 530 h 800 intensity 93829.5759344697 
x 363 y 800 width 530 h 800 intensity 94079.55780857801 
x 364 y 800 width 530 h 800 intensity NaN 
x 365 y 800 width 530 h 800 intensity NaN 
x 366 y 800 width 530 h 800 intensity NaN 

我试过双等,并没有运气!任何人都有什么最适合使用的想法?

感谢

+0

什么编程语言? –

+0

@PaulR道歉 - Java – redrubia

+3

花车可以比这更高,所以别的是错的。参见[这个问题](http://stackoverflow.com/questions/2618059/in-java-what-does-nan-mean)了解NaN含义的一些信息。你的代码是无意中被零等分了吗? – DNA

回答

2

尝试BigDecimal。它保持你想要的精度(例如小数位数)。

+0

我完全同意icza的建议。如果你使用十进制算术(特别是货币)做任何事情,甚至是非常严重的,你应该总是使用'​​BigDecimal'。这里有很多答案可以告诉你为什么。 – DuncanKinnear

2

float可以“高于10k”,double始终是首选。如果数字变得非常大并且您需要所有数字,请使用BigDecimal

如果你不能超过10K,那么在你的计算中会出现一些“其他”问题。

0

花车可以去的方式高于此 - 尝试,例如:

float x = 1000000000000000000000000000000000000.0f; 
    System.out.println(x); 
    System.out.println(x*x); 

,输出:

1.0E36 
Infinity 

所以别的东西是错误的。请注意,使用非常大的数字会导致Infinity而不是NaN

你的代码被无意中零除零或类似的东西?您正在执行的实际计算是什么?

另请参阅this question关于NaN的含义的一些信息。

0

您遇到的问题与您认为的不同。

事实1:float可以远远大于10k。大约340000000000000000000000000000000000K。

事实2:浮动加法溢出导致Infinity,而不是NaN(不是数字)。

你的数学在某个地方有错误。在x 364的计算会导致一些算术错误,使您的总和变差。精度不是问题。