变量类型的问题

时间:2012-10-01 21:09:10

标签: java floating-point formatting biginteger bigdecimal

我基本上总计了一个非常大的数字。我正在使用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

我尝试了双重等,没有运气!任何人对什么是最好用的有任何想法?

由于

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

浮动可以比这更高 - 例如尝试:

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

输出:

1.0E36
Infinity

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

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

有关NaN含义的一些信息,另请参阅this question

答案 3 :(得分:0)

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

事实1:浮动可以远远超过10k。大约340000000000000000000000000000k。

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

你的数学错误。在x 364处的计算导致一些算术错误,这会弄乱你的总和。精度不是问题。