OSX上Java中从大long转换为float的错误?
我在OS/X上运行JDK1.7,64位。我认为这是一个bug。。。因为它既不会出现在Android上,也不会出现在Ubuntu Linux上。也许这是我的x86处理器(今年早些时候刚购买的)…不确定 基本上,我想要一段时间。。。在纳秒或毫秒内。。。表示为浮点数的。当我运行下面的代码,并将System.nanoTime()返回的long转换为浮点时,浮点保持不变。System.currentTimeMillis()也会出现同样的问题。时间(很长)当然在变。。。但是浮子的演员阵容完全失败了。它甚至在我手动输入1404434478024L的大long中失败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()也会出现同样的问题。时间(很长)当然在变。。。但是浮子的演员阵容完全失败了。它甚至在
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;iAfloat
的长度为32位。Along
的长度为64位
主要问题是,在这两种类型之间转换时,会丢失一些精度。更具体地说,将明确介绍:
整型或长型值到浮点或长型值的加宽转换
值加倍,可能会导致精度损失-即结果
可能会丢失一些值的最低有效位。在此
在这种情况下,生成的浮点值将被正确舍入
整数值的版本,使用IEEE 754四舍五入到最近模式
(§4.2.4)
你得到了这个行为。Afloat
是32位长。Along
是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)."