当然, System.out.println(0.1);
输出0.1
。但是对于任意小数点总是这样吗? (排除的双号本身。如,System.out.println(0.10000000000000000001);
输出0.1
精度而导致的情况下)“System.out.println(DECIMAL)”是否始终在代码中输出相同的DECIMAL?
当我打System.out.println(DECIMAL);
我认为,DECIMAL被转换成二进制(双)和二进制转换成十进制(以输出小数点作为字符串)
想想下面的转换。
小数[D1] - >(CONVERSION1) - >二进制[B] - >(CONVERSION2) - >十进制[D2]
CONVERSION1:
(的显著位的范围内双倍)[D1]的最接近的二进制数被选择为[B]
例如[D1] 0.1 - > [B] 0x0.1999999999999a
CONVERSION2:
[D2]是十进制数可以唯一区分[B],并且具有最小的位数。
例如[B] 0x0.1999999999999a - > [D2] 0.1
QUOTE Java7 API Double.toString(double d)
多少位必须被打印的米或一个小数部分?必须至少有一位数字来表示小数部分,并且除此之外还需要多少位数,但只需要多少位数来唯一地区分参数值和类型为double的相邻值。也就是说,假设x是由该方法对有限非零参数d产生的十进制表示所表示的精确数学值。那么d必须是最接近x的double值;如果两个double值都同样接近x,那么d必须是其中之一,d的有效数字的最低显著位必须为0
我的问题:
“[D1] = [D2]”是否总是正确的?
为什么我问这个问题:
思考下面的情况,
节省用户的十进制输入作为双 - >显示的是十进制
我想知道是否保证[用户输入=显示]。
(如上所述,排除由双数本身的精度导致的情况。因为那很长的输入是罕见的情况。)
我知道当我需要精确的算术时,我应该使用BigDecimal。但在这种情况下,我不需要精确的算术。只想显示与用户输入相同的小数点。
听起来像你一路都知道,但你想要你的方式! :)但它会很有趣,看到它的一些答案。 – sakura
我已经读过两遍你的问题,但我仍然不明白你的问题。 –