此问题已在此处找到答案:
在java中使用double保持精度(22个答案)3小时前关门了。在java中是否有一种数据类型可以处理/存储超过double类型的数字?据我所知,java type double可以存储范围为1.0e+38到1.0e-45的数字。如果我需要java程序读取超过数字精度1.0e+38和1.0e-45的数字,该怎么办?例如1.0e-180。目前这些数字被识别为0.0。别问我为什么需要这么荒谬的数字。我得到了别人给我的东西。
2ekbmq321#
据我所知,java type double可以存储范围为1.0e+38到1.0e-45的数字。不正确;它可以走得更远 1.7976931348623157 * 10^308 及 4.9406564584124654 x 10^-324 .但是,在一个double中最多只能存储2^64个数字(原因:请考虑一下)。鸽子洞原理)。在0和1之间有无限多的数字,更不用说在这两个极端之间了。Double的工作方式是,一直默默地四舍五入到最接近的数字,即所选的几个2^64中的一个。让我们称这些数字为受祝福的数字。这些数字分布不均。在0附近,有很多这样的元素,当你离开0时,它们会越来越少。最终(在2^52左右),任何两个受祝福的数字之间的距离都大于 1.0 .bigdecimal是一种解决方案。还有其他一些(对于初学者来说,double可以表示1e-108-您在“将输入数据转换为双值”代码中犯了错误),但请记住,在这些极端情况下,double是非常不准确的。像这样的数字的bd速度非常慢,而且开箱即用,bds不能开箱即用(因为同样的原因,你不能用1除以3得到一个完美的结果:0.333333。。。在哪里停止?——您需要对其进行配置,使其在某个点中断。它们很难使用,但也许是你唯一的选择。
1.7976931348623157 * 10^308
4.9406564584124654 x 10^-324
1.0
1条答案
按热度按时间2ekbmq321#
据我所知,java type double可以存储范围为1.0e+38到1.0e-45的数字。
不正确;它可以走得更远
1.7976931348623157 * 10^308
及4.9406564584124654 x 10^-324
.但是,在一个double中最多只能存储2^64个数字(原因:请考虑一下)。鸽子洞原理)。在0和1之间有无限多的数字,更不用说在这两个极端之间了。Double的工作方式是,一直默默地四舍五入到最接近的数字,即所选的几个2^64中的一个。让我们称这些数字为受祝福的数字。
这些数字分布不均。在0附近,有很多这样的元素,当你离开0时,它们会越来越少。最终(在2^52左右),任何两个受祝福的数字之间的距离都大于
1.0
.bigdecimal是一种解决方案。还有其他一些(对于初学者来说,double可以表示1e-108-您在“将输入数据转换为双值”代码中犯了错误),但请记住,在这些极端情况下,double是非常不准确的。
像这样的数字的bd速度非常慢,而且开箱即用,bds不能开箱即用(因为同样的原因,你不能用1除以3得到一个完美的结果:0.333333。。。在哪里停止?——您需要对其进行配置,使其在某个点中断。它们很难使用,但也许是你唯一的选择。