Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala中Long与Double的转换与比较_Scala - Fatal编程技术网

Scala中Long与Double的转换与比较

Scala中Long与Double的转换与比较,scala,Scala,我在玩ScalaAnyVal类型,很难解决以下问题:我将Long.MaxValue转换为Double并返回到Long。由于Long(64位)可以容纳比Double尾数(52位)更多的数字,我预计此转换将导致一些数据丢失,但不知何故,情况并非如此: Long.MaxValue.equals(Long.MaxValue.toDouble.toLong) // is true 我认为在Long.MaxValue.toDouble.toLong中可能有一些魔法/优化,这样转换就不会真正发生。所以我也试

我在玩Scala
AnyVal
类型,很难解决以下问题:我将
Long.MaxValue
转换为
Double
并返回到
Long
。由于
Long
(64位)可以容纳比
Double
尾数(52位)更多的数字,我预计此转换将导致一些数据丢失,但不知何故,情况并非如此:

Long.MaxValue.equals(Long.MaxValue.toDouble.toLong) // is true
我认为在
Long.MaxValue.toDouble.toLong
中可能有一些魔法/优化,这样转换就不会真正发生。所以我也试着:

Long.MaxValue.equals("9.223372036854776E18".toDouble.toLong) // is true
如果我计算表达式
“9.223372036854776E18”.toDouble.toLong
,则得到:

9223372036854775807
9223372036854775808

这真的吓坏我了,最后4个数字似乎只是突然从哪里冒出来

首先:像往常一样,对于这样的问题,Scala没有什么特别之处,所有现代语言(据我所知)都使用IEEE 754浮点(至少在实践中,如果语言规范不需要它的话),它们的行为都是一样的,只是类型和操作名称不同而已

是的,数据丢失了。如果您尝试使用例如
(Long.MaxValue-1).toDouble.toLong
,您仍然会返回
Long.MaxValue
。您可以找到下一个最小的
Long
,您可以从
someDouble.toLong
获得,如下所示:

scala> Math.nextDown(Long.MaxValue.toDouble).toLong
res0: Long = 9223372036854774784
如果我计算表达式
“9.223372036854776E18”.toDouble.toLong
,则得到:

9223372036854775807
9223372036854775808
这真的吓坏我了,最后4个数字似乎只是突然从哪里冒出来


你大概是指
9223372036854775807
9.223372036854776E18当然比这还要大:它表示
9223372036854776000
。但是如果你同时使用比Long.MaxValue大的任何其他
Double
,例如
1E30.toLong
,,你会得到同样的结果。首先:像往常一样,像这样的问题,Scala没有什么特别之处,所有现代语言(我所知道的)都使用IEEE 754浮点(至少在实践中,如果语言规范不需要的话)并且将表现相同,只是类型和操作名称不同

是的,数据丢失。如果您尝试使用例如
(Long.MaxValue-1).toDouble.toLong
,您仍然会返回
Long.MaxValue
。您可以从
someDouble.toLong
找到下一个最小的
Long
,如下所示:

scala> Math.nextDown(Long.MaxValue.toDouble).toLong
res0: Long = 9223372036854774784
如果我计算表达式
“9.223372036854776E18”.toDouble.toLong
,则得到:

9223372036854775807
9223372036854775808
这真的吓坏我了,最后4个数字似乎只是突然从哪里冒出来


你大概是说
9223372036854775807
9.223372036854776E18
当然比它大:它代表
9223372036854776000
。但是如果你使用任何其他
Double
大于
Long.MaxValue
,例如
1E30.toLong
请注意,Scala中的Double和Long值相当于基本类型Double和Long


实际上,
Long.MaxValue.toDouble
的结果大于
Long.MaxValue
,原因是该值被舍入。下一次转换,即
Long.MaxValue.toDouble.toLong
被舍入回到
Long.MaxValue的值,只需注意,Scala中的Double和Long值相当于基本类型Double和Long


实际上,
Long.MaxValue.toDouble
的结果大于
Long.MaxValue
,原因是该值被舍入。下一次转换,即
Long.MaxValue.toDouble.toLong
被舍入回到
Long.MaxValue

谢谢,我没有看到9.223372036854776E18比Long.MaxValue大。在这种情况下,我当然会一直长。MaxValue回来。谢谢!谢谢,我没有看到9.223372036854776E18比Long.MaxValue大。在这种情况下,我当然会一直长。MaxValue ba谢谢你!