这是在参考注释在此问题

  

这个代码在Java中产生12.100000000000001并且这被使用能够呈现12.1准确的64位双精度。 - Pyrolistical

这是真的吗?我认为,由于浮点数被表示为两个大国的总和,你不能代表12.1准确,不管你有多少位有。然而,当我实现两者的算法和印有调用它们的结果(12.1,3)与许多显著数字,我分别得到,为他的和矿:

12.10000000000000000000000000000000000000000000000000000000000000000000000000 12.10000000000000100000000000000000000000000000000000000000000000000000000000

我印刷此使用String.format("%76f")。我知道这是多个零比必要的,但我没有看到任何舍入的12.1。

有帮助吗?

解决方案

没有。正如其他人在followups他的评论指出,没有总和(有限数量)的两个大国能永远加起来正好12.1。就像你不能代表1/3恰好基地十个,无论你小数点后多少位使用。

其他提示

在二进制,12.1是:

1100.000110011001100110011...

由于这不终止,它不能被精确地在双,或任何其他有限宽度二进制浮点类型的53个有效数位表示。

尝试来表达二进制0.1:结果 0.5是太大点击 0.25太大点击 0.125太大点击 0.0625配合,并留下0.0375结果余数 0.03125配合,并留下的0.00625结果余数 0.015625太大点击 0.0078125太大点击 0.00390625配合,并留下的0.00234375结果余数 0.001953125配合,并且留下的余数0.000390625

这将不断重复下去,产生的0.00011001100基部2值...

没有,它不能被精确地在双表达。如果Java支持BCD,或定点小数,将工作完全一样。

不以二进制,没有。如果你让我天马行空,你可以在“浮点二进制编码的十进制”(其中,向我所知,从未实现):

12.1 = 0000 . 0001 0010 0001 * (10^2)

在二元所有非零值的形式1.xyz * m的,和IEEE形式利用了这一点,省略领先1.我不知道相当于是做什么用FP-BCD,所以我走了值的形式0.xyz * m代替。

我建议您阅读什么每台计算机科学家应该知道关于浮点浮点运算的。然后你就会知道。 :)

一个办法看到双是相当准确的将其转换为BigDecimal的。

// prints 12.0999999999999996447286321199499070644378662109375
System.out.println(new BigDecimal(12.1));

是,可以精确地表示12.1浮点。 你只是需要一个十进制浮点表示,而不是二进制一。

使用的BigDecimal类型,你会完全代表它!

没有,十进制数12.1不能被表示为一个有限的(终止)二进制浮点数。

记住12.1是有理数121/10。请注意,此级分在最低术语(不能通过除去分子的分母的共同fators被减小)。

假设(以达到一个矛盾),该121/10可以也写作n / (2**k)其中nk一些正整数,且2**k表示的两个kth功率。我们将有一个反例来唯一分解。特别地

10 * n == 2**k * 121

,其中左手侧是由5整除其中右手侧是没有的。

这可以用一种选择是,不存储V = 0.1,而是商店V10 = 1。在需要时(该司将在结果创建截断误差,但v仍将OK)

只需除以10

在这种情况下,你基本上是做一个固定的点劈,但保持在浮数。 但它通常不值得这样做,除非你真的不得不这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top