Scala中Long与Double的转换与比较
我在玩ScalaScala中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中可能有一些魔法/优化,这样转换就不会真正发生。所以我也试
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谢谢你!