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)
为浮点数分配给双变量时,为什么会有近似值?
当您将小数部分转换为时,实际上会发生逼近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)
| 归档时间: |
|
| 查看次数: |
4281 次 |
| 最近记录: |