OSX上Java中从大long转换为float的错误?

OSX上Java中从大long转换为float的错误?,java,math,casting,Java,Math,Casting,我在OS/X上运行JDK1.7,64位。我认为这是一个bug。。。因为它既不会出现在Android上,也不会出现在Ubuntu Linux上。也许这是我的x86处理器(今年早些时候刚购买的)…不确定 基本上,我想要一段时间。。。在纳秒或毫秒内。。。表示为浮点数的。当我运行下面的代码,并将System.nanoTime()返回的long转换为浮点时,浮点保持不变。System.currentTimeMillis()也会出现同样的问题。时间(很长)当然在变。。。但是浮子的演员阵容完全失败了。它甚至在

我在OS/X上运行JDK1.7,64位。我认为这是一个bug。。。因为它既不会出现在Android上,也不会出现在Ubuntu Linux上。也许这是我的x86处理器(今年早些时候刚购买的)…不确定

基本上,我想要一段时间。。。在纳秒或毫秒内。。。表示为浮点数的。当我运行下面的代码,并将System.nanoTime()返回的long转换为浮点时,浮点保持不变。System.currentTimeMillis()也会出现同样的问题。时间(很长)当然在变。。。但是浮子的演员阵容完全失败了。它甚至在我手动输入1404434478024L的大long中失败

        for (int i=0; i<10; i++) { 
//          long timeL = 1404434478024L;
            long timeL = java.lang.System.nanoTime();
//          long timeL = java.lang.System.currentTimeMillis();

            float timeF = timeL;
            System.out.printf("%d: TimeL is %d.  timeF is %f. ", i, timeL, timeF);  

            Long pTimeL = new Long(timeL);
            float timeF2 = pTimeL.floatValue();
            System.out.printf("   And timeF2 is %f.\n", timeF2);    
        } 

Output:

0: TimeL is 1404435840046330000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
1: TimeL is 1404435840046601000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
2: TimeL is 1404435840046870000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
3: TimeL is 1404435840047149000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
4: TimeL is 1404435840047417000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
5: TimeL is 1404435840047690000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
6: TimeL is 1404435840047959000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
7: TimeL is 1404435840048230000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
8: TimeL is 1404435840048517000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.
9: TimeL is 1404435840048813000.  timeF is 1404435888972234750.000000.    And timeF2 is 1404435888972234750.000000.

for(int i=0;iA
float
的长度为32位。A
long
的长度为64位

主要问题是,在这两种类型之间转换时,会丢失一些精度。更具体地说,将明确介绍:


整型或长型值到浮点或长型值的加宽转换 值加倍,可能会导致精度损失-即结果 可能会丢失一些值的最低有效位。在此 在这种情况下,生成的浮点值将被正确舍入 整数值的版本,使用IEEE 754四舍五入到最近模式 (§4.2.4)


你得到了这个行为。

A
float
是32位长。A
long
64位

主要问题是,在这两种类型之间转换时,会丢失一些精度。更具体地说,将明确介绍:


整型或长型值到浮点或长型值的加宽转换 值加倍,可能会导致精度损失-即结果 可能会丢失一些值的最低有效位。在此 在这种情况下,生成的浮点值将被正确舍入 整数值的版本,使用IEEE 754四舍五入到最近模式 (§4.2.4)


你得到了这个行为。

这是一个误用
float
的案例,而不是一个bug。
float
类型的精度有限,普通数字为24位,相当于7位以上的十进制数字。
long
值在最重要的12位十进制数字中都是相同的,因此它们都转换为相同的值
float

如果在您的时间间隔内有进位,则抑制最重要的32位可能会产生不良影响


System.nanoTime()
没有绝对意义。只有相对值和差异才有意义。我建议从
long
中的每个nanoTime结果中减去第一个nanoTime结果,然后再转换为
double
float
进行后续计算。

这是误用
float
的情况,而不是bug、
float
类型的精度有限,普通数字为24位,相当于超过7位十进制数字。您的
long
值在最有效的12位十进制数字中都是相同的,因此它们都转换为相同的
float

如果在您的时间间隔内有进位,则抑制最重要的32位可能会产生不良影响


System.nanoTime()
没有绝对意义。只有相对值和差异才有意义。我建议从
long
中的每个nanoTime结果中减去第一个nanoTime结果,然后再转换为
double
float
进行后续计算。

我无法评论,因此我将其作为一个答案:

以下是我得到的输出:

0: TimeL is 19799440493105.  timeF is 19799440621568.000000.    And timeF2 is 19799440621568.000000.
1: TimeL is 19799461838486.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
2: TimeL is 19799462215508.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
3: TimeL is 19799462573212.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
4: TimeL is 19799462915822.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
5: TimeL is 19799463295259.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
6: TimeL is 19799463587157.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.                    
7: TimeL is 19799463867585.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
8: TimeL is 19799464241890.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
9: TimeL is 19799464598084.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
上面的代码工作得很好,但问题可能是您的时间太长,无法转换为float,因此请尝试使用double

希望这有助于:
经典

我无法评论,因此我将写下它作为答案:

以下是我得到的输出:

0: TimeL is 19799440493105.  timeF is 19799440621568.000000.    And timeF2 is 19799440621568.000000.
1: TimeL is 19799461838486.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
2: TimeL is 19799462215508.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
3: TimeL is 19799462573212.  timeF is 19799461593088.000000.    And timeF2 is 19799461593088.000000.
4: TimeL is 19799462915822.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
5: TimeL is 19799463295259.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
6: TimeL is 19799463587157.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.                    
7: TimeL is 19799463867585.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
8: TimeL is 19799464241890.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
9: TimeL is 19799464598084.  timeF is 19799463690240.000000.    And timeF2 is 19799463690240.000000.
上面的代码工作得很好,但问题可能是您的时间太长,无法转换为float,因此请尝试使用double

希望这有助于:
经典

我建议你研究浮点数的存储方式。浮点数不能像整数那样精确地存储一个数字,比如
long
,可以。从浮点改为双精度。一个浮点只能携带大约6位精度。你确定这在安卓和Ubuntu上有效吗?@user2357112-我猜他在安卓上的代码Ubuntu使用了双精度和浮点型。或者纳米时间的值更小。什么值有效?我建议你研究浮点型数字的存储方式。它们不能像整数那样精确地存储数字,比如
long
,可以。从浮点型变为双精度。浮点型只能携带大约6位精度在上。你确定这在Android和Ubuntu上有效吗?@user2357112-我猜他在Android和Ubuntu上的代码使用了double vs float。或者可能nanoTime的值更小。什么值有效?请注意,几个不同的long转换为相同的float。“将int或long值扩大转换为float,或将long值扩大转换为double,可能会导致精度损失-也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入到最近模式(§4.2.4)。“请注意,几个不同的多头转换为相同的浮动。”将int或long值扩大转换为float,或将long值扩大转换为double,可能会导致精度损失-也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入到最近模式(§4.2.4)."