当然, System.out.println( 0.1 );
输出0.1
。 但是,它永远对一个任意的十进制? (排除的双号本身的精度而导致的情况下如,。 System.out.println( 0.10000000000000000001);
输出0.1
)
当我打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(双d)
必须多少位为m或a的小数部分? 必须有至少一个数来表示小数部分,并且除此之外,需要来唯一地区分型双的相邻值的参数值,作为许多,但仅作为许多,多个数字。 也就是说,假设x是由通过该方法对于有限的非零参数d产生的十进制表示法表示的精确的数学值。 然后d必须是最接近x的双值; 或者如果两个双值同样接近x,那么d必须它们中的一个和d的有效数字的最低位显著必须是0。
我的问题 :
是 “[D1] = [D2]” 总是为真?
我为什么问这个问题 :
有关下列情况下思考,
用户的十进制输入保存为双- >显示小数
我想知道[用户的输入显示=]是否保证与否。
(如上所述,排除的双号本身的精度而产生的情况下,由于其长的输入是罕见的情况。)
我知道当我需要精确的算法,我应该使用的BigDecimal。 但是,在这种情况下,我并不需要精确的算法。 只是想显示相同的数字作为用户的输入。