【发布时间】:2014-03-04 11:24:42
【问题描述】:
当然,
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:
(在double有效位范围内)选择[D1]最接近的二进制为[B]
例如[D1] 0.1 -> [B] 0x0.1999999999999a
CONVERSION2:
[D2]是能唯一区分[B]且位数最小的十进制数。
例如[B] 0x0.1999999999999a -> [D2] 0.1
引用Java7 API Double.toString(double d)
m 或 a 的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,必须有尽可能多的数字,但仅能将参数值与相邻的 double 类型值区分开来。也就是说,假设 x 是由该方法为有限非零参数 d 生成的十进制表示所表示的精确数学值。那么 d 必须是最接近 x 的 double 值;或者如果两个 double 值同样接近 x,则 d 必须是其中之一,并且 d 的有效位的最低有效位必须为 0。
我的问题:
“[D1]=[D2]”总是正确的吗?
我为什么要问这个问题:
考虑下面的案例,
将用户的十进制输入保存为双精度 -> 显示该十进制
我想知道 [user's input = display ] 是否有保证。
(如上所述,排除由双精度数本身导致的情况。因为这种长输入很少见。)
我知道当我需要精确算术时,我应该使用 BigDecimal。但在这种情况下,我不需要精确的算术。只想显示与用户输入相同的小数。
【问题讨论】:
-
听起来你很了解,但你想要自己的方式!! :) 但看到一些答案会很有趣。
-
你的问题我看了两遍,还是没看懂你的问题。
标签: java floating-point floating-point-precision