[英]Faster implementation of Math.round?
這段代碼是否有任何缺點,這似乎是java.lang.Math.round
的更快(和更正確)的版本?
public static long round(double d) {
if (d > 0) {
return (long) (d + 0.5d);
} else {
return (long) (d - 0.5d);
}
}
它利用了這樣一個事實,即在Java中,截斷到長輪到零。
內置方法處理的一些特殊情況 ,代碼無法處理。 從文檔:
NaN
,則結果為0。 Integer.MIN_VALUE
值的值,則結果等於Integer.MIN_VALUE
的值。 Integer.MAX_VALUE
值的值,則結果等於Integer.MAX_VALUE
的值。 我一直在測試這個,有一個關鍵的潛在缺點,這里還沒有描述:你正在改變舍入打破平局的方法。
Math.round()
實現了“round half up”規則,而round()
方法實現了“round round of zero”規則。
例如:
Math.round(-0.5d)
=> 0L
Your.round(-0.5d)
=> -1L
這對您來說可能是也可能不是問題,但您應該理解上述方法不是Math.round()
替代品,即使已經概述了NaN和無窮大的考慮因素。
另一個相關問題: 在Java中舍入負數
至於性能,毫無疑問,上述方法明顯快於Math.round()
- 它在大約35%的時間內運行,用於隨機生成的正值和負值。 在緊密循環中調用此方法時,這可能是一個值得優化的。 當僅給出正值時,它甚至更好(運行時的25%),可能是因為CPU使用分支預測 。
Math.round()
最終由本機JNI調用實現,這可能是性能差異的原因。 這個Sun / Oracle漏洞表明在j6u22中可能有純Java版本,但是我無法看到j6u23中的Math.round()
在我的測試中與j6u16類似。 我沒有在其他版本上測試過。
是; 你沒有考慮下溢或溢出。 從語用上講,這對您的申請可能無關緊要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.