gpt4 book ai didi

java - float 到双重分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:31 25 4
gpt4 key购买 nike

考虑以下代码片段

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);

我得到的输出是

num : 281.583 amount: 28158 rounded: 281.58 dbl: 281.5799865722656 dbl2: 281.5830078125

为什么将 float 分配给 double 变量时会出现近似值?

最佳答案

当您将小数转换为float 时,实际上会发生近似。我可能会让您感到惊讶,但是 281.583 在 PC 中不能完全表示为 float 。发生这种情况是因为 float 在 PC 中表示为二进制分数之和。 0.50.250.125可以精确转换,但0.583不行。

float (和 double )表示为 Σ( 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

关于java - float 到双重分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4154439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com