双重数据类型混淆 - 兑换

时间:2017-10-22 08:00:39

标签: java double

我的一个问题最近被重复关闭,但这并没有完全帮助我。我的新问题和更具体的问题是:

可以将所有小于1.7e308且大于0的值(整数,没有任何小数部分)存储在 double 数据类型中,因为1.7e308是的最大值双数据类型?因为我不想要一个十进制数字,但是一个很大的非十进制数字,即使是很长的长也无法表示。

2 个答案:

答案 0 :(得分:0)

所有浮动类型数字(halfs / floats / double / long double / etc等)由尾数和指数组成。

假设您有1.7e3081.7是尾数,而308是指数。你不能在浮点数中将两者完全分开。这是因为每个浮点数都表示为上述内存中的组合。因此,您不能拥有“非小数”浮点数。

答案 1 :(得分:0)

  

小于1.7e308且大于0的所有整数都可以存储在双数据类型

简单的答案是否。

有各种方法可以得出这个结论,但这里有一个甚至不依赖于对浮点数格式的理解。

  1. 我们知道double是64位表示。
  2. 因此,最多可以有2个 64 不同double值:约为1.8 x 10 19
  3. 您在询问double是否可以表示0到1.7 x 10 308 之间的所有整数。
  4. 即1.7 x 10 308 不同的值。
  5. 1.7 x 10 308 大于1.8 x 10 19
  6. 因此,你所要求的是不可能的。
  7. 您最简单的选择是使用BigInteger

    但是你这样说:

      

    ...但由于BigIntegers的操作速度慢,我将它作为最后的选择。将两个4位数字相乘需要大约一秒钟。

    这根本不是真的。如果您通过基准测试得出结论,那么您的方法就会出现问题。

    使用BigInteger乘以2 x 4位数字的时间应该不到一微秒。