java - 是否存在超过 double 数字精度的 Java 数据类型?
问题描述
是否有一种数据类型可以处理/存储 Java 中超过 double 类型的数字?据我所知,Java 类型 double 可以存储 1.0E+38 到 1.0E-45 范围内的数字。
如果我需要 Java 程序读取超过 1.0E+38 和 1.0E-45 的数字精度的数字怎么办?例如 1.0E-180。目前,这些数字被识别为 0.0 。不要问我为什么需要这么荒谬的数字。我得到了给我的东西。
解决方案
据我所知,Java 类型 double 可以存储 1.0E+38 到 1.0E-45 范围内的数字。
不正确;它可以达到1.7976931348623157 * 10^308
和4.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 ...... ?) - 您需要对其进行配置,使其在某些时候切断。它们很难使用,但也许是您唯一的选择。
推荐阅读
- tmux - 发送密钥的 tmux 错误(尝试与 xclip 交互)
- google-apps-script - Apps Script Advanced Calendar API - 插入带有标题的新事件 - 错误“无效的源 URL:”
- javascript - PHP 按位异或与 JavaScript 按位异或
- reactjs - reactjs中如何导入
- html - 如何保持两个不同 HTML 元素之间的高度和宽度?
- javascript - Angular 6:Npm 错误!缺少脚本:部署到 heroku 时开始
- java - 无法在 Android Studio 中使用 getFont
- unity3d - Unity 升级到 2018.1.6 清单导致 android 构建失败
- javascript - Node.js 给出 SyntaxError: Unexpected token import
- javascript - eslint 没有捕捉到另一个模块中定义的拼写错误的函数名