浮动到双重赋值

Pra*_*u R 6 java floating-accuracy double-precision approximation

请考虑以下代码段

float num = 281.583f;
int amount = (int) Math.round(num*100f);
float rounded = amount/100.0f;
double dblPrecision = rounded;
double dblPrecision2 = num;
System.out.println("num : " + num + " amount: " + amount + " rounded: " + rounded + " dbl: " + dblPrecision + " dbl2: " + dblPrecision2);
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

num : 281.583 amount: 28158 rounded: 281.58 dbl: 281.5799865722656 dbl2: 281.5830078125
Run Code Online (Sandbox Code Playgroud)

为浮点数分配给双变量时,为什么会有近似值?

And*_*rey 6

当您将小数部分转换为时,实际上会发生逼近float.我可能会让你大吃一惊,但281.583不能代表准确地在PC作为浮点数.这是因为浮点数表示为PC中二进制分数的总和.0.5,0.25并且0.125可以精确地转换,但不是0.583.

浮点数(和双精度数)表示为?( 1/2^i*Bi ),Bi第i位(0|1).0.625 = 1/2 + 1/4例如.问题是并非所有小数部分都可以转换为二进制分数的最终总和.

以下是此数字的转换方式(第一行是列定义).

i|  *2 and trim|    Bit value|  (2^-1)*bit
    0,583       
1   1,166   1   0,5
2   0,332   0   0
3   0,664   0   0
4   1,328   1   0,0625
5   0,656   0   0
6   1,312   1   0,015625
7   0,624   0   0
8   1,248   1   0,00390625
9   0,496   0   0
10  0,992   0   0
11  1,984   1   0,000488281
12  1,968   1   0,000244141
13  1,936   1   0,00012207
14  1,872   1   6,10352E-05
15  1,744   1   3,05176E-05
16  1,488   1   1,52588E-05
17  0,976   0   0
18  1,952   1   3,8147E-06
19  1,904   1   1,90735E-06
        SUM=    0,582998276
Run Code Online (Sandbox Code Playgroud)