相关疑难解决方法(0)

为什么十进制数不能用二进制表示?

关于浮点表示,已经向SO发布了几个问题.例如,十进制数0.1没有精确的二进制表示,因此使用==运算符将其与另一个浮点数进行比较是危险的.我理解浮点表示的原理.

我不明白的是,从数学的角度来看,为什么小数点右边的数字比左边的数字更"特殊"?

例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分始终是精确的.但数字6.10并不准确.我所做的只是将十进制移动到一个地方,然后我突然从Exactopia转到了Inexactville.在数学上,两个数字之间应该没有内在差异 - 它们只是数字.

相比之下,如果我将小数位移到另一个方向以产生数字610,我仍然在Exactopia中.我可以继续向那个方向前进(6100,610000000,610000000000000),它们仍然是精确,准确,准确的.但是一旦小数越过某个阈值,数字就不再精确了.

这是怎么回事?

编辑:为了澄清,我想远离关于行业标准表示的讨论,例如IEEE,并坚持我认为是数学上"纯粹"的方式.在基数10中,位置值为:

... 1000  100   10    1   1/10  1/100 ...
Run Code Online (Sandbox Code Playgroud)

在二进制文件中,它们将是:

... 8    4    2    1    1/2  1/4  1/8 ...
Run Code Online (Sandbox Code Playgroud)

对这些数字也没有任何限制.位置无限增加到左侧和右侧.

math floating-point

275
推荐指数
8
解决办法
9万
查看次数

在Java中将字符串转换为带有2个小数位的十进制数

在Java中,我试图将一串格式解析"###.##"为float.该字符串应始终具有2个小数位.

即使字符串中有值123.00,浮子也应该是123.00,不123.0.

这是我到目前为止:

System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);

Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);

DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);
Run Code Online (Sandbox Code Playgroud)

它打印:

string liters of petrol putting in preferences is 010.00 
liters of petrol before putting in editor: 10.0
Run Code Online (Sandbox Code Playgroud)

java string floating-point number-formatting

5
推荐指数
3
解决办法
15万
查看次数

Java如何将浮点数转换为字符串

这就是我在看的内容:

float p=1.15f;
BigDecimal bdp=new BigDecimal(p);
float q=1.1499999f;
float r=1.14999999f;

System.out.println(p);   //1.15
System.out.println(bdp); //1.14999997615814208984375
System.out.println(q);   //1.1499999
System.out.println(r);   //1.15
Run Code Online (Sandbox Code Playgroud)

所以我理解"p"1.15的十进制值不能用二进制表示.
因此,大的十进制"bdp"输出对我来说非常有意义......这就是浮点数的实际值.

问题1
当浮点数"p"转换回字符串输出(如1.15)时,舍入的方式/位置(从内部1.149..375到1.15)?

它在文档中指定了哪里?toString javadoc并没有真正的帮助(至少我).

我确实在语言规范中看到了这一点:

float和double类型的元素是可以分别使用IEEE 754 32位单精度和64位双精度二进制浮点格式表示的值.

维基百科的IEEE 754文章给出了这样的结论:

这给出了6到9个有效十进制数字精度(如果一个十进制字符串最多有6个有效小数被转换为IEEE 754单精度,然后转换回相同数量的有效小数,则最终字符串应与原始字符串匹配;

问题2
因此,似乎Java/IEEE 754浮点数应该如何工作?

我保证浮点/字符串转换/表示的准确性达到一定数量的数字(如"p"和"q"),如果超过该位数,Java将进行一些舍入显示(如"r") ")?

感谢帮助.

java floating-point

5
推荐指数
2
解决办法
876
查看次数

标签 统计

floating-point ×3

java ×2

math ×1

number-formatting ×1

string ×1