Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t使用Java将科学记数法中的double转换为整数字符串或Long_Java - Fatal编程技术网

Can';t使用Java将科学记数法中的double转换为整数字符串或Long

Can';t使用Java将科学记数法中的double转换为整数字符串或Long,java,Java,我有以下代码“”+((双)cellValue)。longValue()+“”+cellValue 单元格值是6.2284800183620495E18我得到的输出是 现在我不是专家,但我使用它输出6228480018362050000,这是我所期望的,但Java给了我 6228480018362049536.2284800183620495518 6.2284800183620495518 为什么是6228480018362049536而不是6228480018362050000,我怎样才能得到

我有以下代码
“”+((双)cellValue)。longValue()+“”+cellValue

单元格值是
6.2284800183620495E18
我得到的输出是

现在我不是专家,但我使用它输出
6228480018362050000
,这是我所期望的,但Java给了我

6228480018362049536.2284800183620495518 6.2284800183620495518

为什么是
6228480018362049536
而不是
6228480018362050000
,我怎样才能得到真实的数字

我使用的是Java8

浮点
float
float
double
double
类型都使用技术。这项技术以牺牲准确性来提高执行速度。这种技术在处理非常大或非常小的数字时也有局限性

BigDecimal
对于精确的数字或非常大/非常小的数字,请使用类(或其整数表亲,类)。与浮点运算相比,执行速度非常慢,但精确且具有更大的大小限制。这对类是Java最好的特性之一,与其他缺乏工具的开发环境相比,这是一个主要优势

BigDecimal
类支持:

  • ()
  • ()
  • 普通符号()
示例代码

String input = "6.2284800183620495E18" ;
BigDecimal bd = new BigDecimal( input );
bd.toString():6.2284800183620495E+18

bd.toEngineeringString():6.2284800183620495E+18

bd.toPlainString():6228480018362049500

请参阅。

浮点
float
float
double
double
类型都使用技术。这项技术以牺牲准确性来提高执行速度。这种技术在处理非常大或非常小的数字时也有局限性

BigDecimal
对于精确的数字或非常大/非常小的数字,请使用类(或其整数表亲,类)。与浮点运算相比,执行速度非常慢,但精确且具有更大的大小限制。这对类是Java最好的特性之一,与其他缺乏工具的开发环境相比,这是一个主要优势

BigDecimal
类支持:

  • ()
  • ()
  • 普通符号()
示例代码

String input = "6.2284800183620495E18" ;
BigDecimal bd = new BigDecimal( input );
bd.toString():6.2284800183620495E+18

bd.toEngineeringString():6.2284800183620495E+18

bd.toPlainString():6228480018362049500


请参阅。

打印为6.2284800183620495E18的双精度数字表示为 0x43D59C0064EA45A9=01000011 11010101 10011100 00000000 01100100 11101010 01000101 10101001

(玩这个)

这意味着它是1.0101100111000000000001100111010100100010101001₂ * 2至1000011101的功率₂ - 1023₁₀ (有关其工作原理,请参见) 结果是608250017931689*1024=6228480018362049536,这就是你得到的答案

因此,通过转换为long给出的答案是正确的-6228480018362049536是一个64位整数值的十进制表示形式,相当于给定的双精度值

这就提出了一个问题,为什么数字的十进制表示形式是6.2284800183620495E18

这是因为每个浮点值并不代表数字行上的一个点,而是一个范围——一位的变化(在最后一位称为单位)将改变1024的值。 6228480018362049536-512到6228480018362049536+511之间的数字都对应于相同的双精度值。 Java选取的值具有最少的要打印的位数,该值属于此范围,没有其他值- 6228480018362049000-并将其作为科学记数法写入6.228480018362049E18


如果您不需要近似值,请按照Basil Bourque的建议使用任意精度,或者(如果您的用例允许)使用基于long的定点或整数表示。

打印为6.2284800183620495E18的双精度数字表示为 0x43D59C0064EA45A9=01000011 11010101 10011100 00000000 01100100 11101010 01000101 10101001

(玩这个)

这意味着它是1.0101100111000000000001100111010100100010101001₂ * 2至1000011101的功率₂ - 1023₁₀ (有关其工作原理,请参见) 结果是608250017931689*1024=6228480018362049536,这就是你得到的答案

因此,通过转换为long给出的答案是正确的-6228480018362049536是一个64位整数值的十进制表示形式,相当于给定的双精度值

这就提出了一个问题,为什么数字的十进制表示形式是6.2284800183620495E18

这是因为每个浮点值并不代表数字行上的一个点,而是一个范围——一位的变化(在最后一位称为单位)将改变1024的值。 6228480018362049536-512到6228480018362049536+511之间的数字都对应于相同的双精度值。 Java选取的值具有最少的要打印的位数,该值属于此范围,没有其他值- 6228480018362049000-并将其作为科学记数法写入6.228480018362049E18


如果您不需要近似值,请按照Basil Bourque的建议使用任意精度,或者(如果您的用例允许的话)使用基于long的定点或整数表示。

尝试使用BigDecimal,看看这会给您带来什么。Double是近似值,不是实际值。你使用的工具和java给你不同的数字的原因是它们以不同的方式处理浮点数。我建议搜索和阅读“每个计算机科学家都应该知道的浮点数算术知识”的可能重复你的标题是胡说八道。双打不是“科学记数法”。转换为字符串时,您得到的是科学符号。@EJP有帮助吗?试试看