首页 > 解决方案 > 是否存在超过 double 数字精度的 Java 数据类型?

问题描述

是否有一种数据类型可以处理/存储 Java 中超过 double 类型的数字?据我所知,Java 类型 double 可以存储 1.0E+38 到 1.0E-45 范围内的数字。

如果我需要 Java 程序读取超过 1.0E+38 和 1.0E-45 的数字精度的数字怎么办?例如 1.0E-180。目前,这些数字被识别为 0.0 。不要问我为什么需要这么荒谬的数字。我得到了给我的东西。

标签: javaprecision

解决方案


据我所知,Java 类型 double 可以存储 1.0E+38 到 1.0E-45 范围内的数字。

不正确;它可以达到1.7976931348623157 * 10^3084.9406564584124654 x 10^-324

但是,一个double最多只能存储2^64个数字(原因:想一想。鸽子洞原理)。在 0 和 1 之间有无数个数字,更不用说在这两个极端之间了。双打的工作方式是一直默默地四舍五入到最接近的数字,即所选的少数 2^64 之一。让我们称这些祝福的数字。

这些数字分布不均。在 0 附近,有很多这样的东西,当你远离 0 时,它们会越来越少。最终(在 2^52 左右),任意 2 个受祝福的数字之间的距离大于1.0.

BigDecimal 是一种解决方案。还有其他的(对于初学者来说,双 CAN 代表 1e-108 - 您在“将输入数据转换为双精度值”代码中做错了),但请记住,在这些极端情况下双精度是非常不准确的。

具有这样数字的 BD 非常慢,而且开箱即用,BD 不能开箱即用(出于同样的原因,您不能将 1 除以 3 并获得完美的结果:0.333333 ...... ?) - 您需要对其进行配置,使其在某些时候切断。它们很难使用,但也许是您唯一的选择。


推荐阅读