当前位置: 首页 > 知识库问答 >
问题:

为什么结果不同?float vs double[重复]

梁丘权
2023-03-14
System.out.println(0.1F + 0.2F); // 0.3
System.out.println(0.1D + 0.2D); // 0.30000000000000004

我理解为0.1d+0.2d~=0.300000000000000004。
但我猜这些结果是相同的,但事实并非如此。
为什么结果不同?

共有1个答案

穆季萌
2023-03-14

为什么结果不一样?

在一般意义上:

  • 因为floatdouble的二进制表示形式不同。
  • 因此,十进制和二进制浮点表示之间的差异(错误)在floatdouble中可能有所不同。
  • 当各个数字的表示误差不同时,计算后的误差也可能不同。

更广泛的理解是:浮点数学坏了吗?

如果你有这样的想法,你可以研究一下这里的数字的二进制表示,并精确地找出这里的错误发生在哪里:

  • 在十进制->二进制浮点转换
  • 浮点算术
  • 在二进制浮点转换->十进制转换中,
  • 或在以上一个以上。

如果您真的想深入研究,我建议您看一看float.floattorawBits方法及其double模拟。这些将允许您检查二进制浮点表示。然后,您可以手动将它们转换为精确的实数,并计算出与“理想”十进制表示法相比的误差。

这是乏味的。

 类似资料:
  • 当我执行普通Select时,返回正确的结果,但当我执行Select for DB uptime时,它始终返回相同的第一个结果。我确实检查了Postgres日志,我看到select被执行了。

  • 我正在尝试使用废料并遇到一些问题。问题是我的脚本返回重复的结果。我正在尝试从父页面抓取URL,并按照每个单独的URL获取关联的日期。抓取每个嵌套的URL后,它似乎会再次从父页面输出URL列表。 下面是脚本: 下面是 json 输出: 重申一下,我很难从父页面输出一个url列表,从每个单独的嵌套URL输出一个相应的日期列表。我是scrapy和python的新手,所以希望有人能给我指出正确的方向。

  • 问题内容: 以下测试失败: 换一种说法: 问题答案: 它们是不同的,因为生成器表达式和list comp中的值都是惰性计算的,即在中调用匿名函数时。 到那时,如果绑定到最后一个值-1。 因此,基本上,这就是列表理解的功能(对于genexp也是如此): 现在,lambda携带了一个引用的闭包,但在两种情况下均绑定为-1,因为这是为其分配的最后一个值。 如果要确保lambda接收到的当前值,请执行 这

  • 最近我遇到了一个gc问题,我用jmap转储堆。但不幸的是它不能正常工作; 我在转储之前运行jmap-histo3916 | more,结果是 然后我运行了"jmap-ump: form=b, file=heap.bin3916",然后我用eclipse MemoryAnalyzer分析了heap.bin,生成了如下直方图 分析这两个结果,我发现dump中的对象都小于histo,char[]中的对象

  • 当我跑的时候。使用CPLEX的NET 4应用程序,我在不同的机器上得到不同的输出。在我的开发机器上,CPLEX输出一个结果(异常并卡在某个大值上),在所有其他机器上,结果都可以。 首先,我认为它与操作系统有关,因为我的开发机器上同时有视窗7 x64和视窗8 x64,所以我尝试在两个系统上运行应用程序。结果是一样的——有缺陷。 然后我试着在两台不同的台式机上运行,效果很好。我甚至在虚拟机内部进行了尝

  • 问题内容: 我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。 在matlab中 在numpy中 这正常吗?我应该如何处理呢? 问题答案: NumPy函数采用一个可选参数:“自由度增量”。默认情况下是。对其进行设置以获取MATLAB结果: 要添加更多上下文,在计算方差(标准偏差为平方根)时,通常将其除以我们拥有的值的数量。 但是,如果我们从较大的分布中选择元素的随机