float計算不準確的替代方法
做報表的時候,有時候會遇到float的運算,偶爾會發生計算值不準確的情況。《Effective Java》中提到,float用於工程計算的運算。
如果需要準確計算float,一種方法就是用BigDecimal來進行計算,以下是一些工具方法。
import java.math.BigDecimal;
public class FloatCalculator {
/**
*
add
* @param a * @param b * @return */ public static float add(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.add(b2).floatValue(); return f; } /** *subtract
* @param a * @param b * @return */ public static float subtract(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.subtract(b2).floatValue(); return f; } /** *multiply
* @param a * @param b * @return */ public static float multiply(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.multiply(b2).floatValue(); return f; } /** *divide
*當不整除,出現無限迴圈小數時,向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數結果為1.6
* @param a * @param b * @return */ public static float divide(float a, float b) { return divide(a, b, 2, BigDecimal.ROUND_HALF_UP); } /** *divide
* @param a * @param b * @param scale * @param roundingMode * @return */ public static float divide(float a, float b, int scale, int roundingMode) { /* * 通過BigDecimal的divide方法進行除法時就會拋異常的,異常如下: * java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) * 解決之道:就是給divide設定精確的小數點divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) * BigDecimal.ROUND_HALF_UP : 向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數結果為1.6 */ BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.divide(b2, scale, roundingMode).floatValue(); return f; } }相關文章
- iOS --NSDecimalNumber 處理計算精度不準確問題iOSDecimal
- 為什麼php的浮點數運算不準確PHP
- 絕密公式算單雙準確率99最強計劃方法公式
- set autotrace on 產生不準確的執行計劃
- setInterval()不準確原因分析
- ls命令統計檔案數量不準確
- c++ float 計算時注意點C++
- Java浮點數float,bigdecimal和double精確計算的精度誤差問題總結JavaDecimal
- Win10系統時間不準確的解決方法 Win10系統時間不準怎麼辦?Win10
- doubule在商用計算中的替代方案
- Es資料彙總不準確的問題
- 統計資訊不準確導致執行計劃走了笛卡爾積
- Google CEO施密特:雲端計算將替代網格計算Go
- 準確詳解:C/C++ float、double資料型別的表示範圍及精度C++資料型別
- 分析交換機的背板頻寬標準計算方法(轉)
- 【分散式計算】MapReduce的替代者-Parameter Server分散式Server
- 導致代理IP驗證不準確的四種原因
- 【MySQL】order by 結果不準確的問題及解決MySql
- MySQL JDBC row_count()數字不準確的問題MySqlJDBC
- 更精確的JAVA運算計時Java
- ETL過程中資料精度不準確問題
- 怎樣得到準確的執行計劃
- 年假計算居然不正確
- 測不準的程式設計師程式設計師
- Oracle如何精確計算row的大小Oracle
- MySQL並行複製延時時間不準確MySql並行
- 迄今最準確方法誕生!AI預測過早死亡風險,準確率高達76%AI
- 準備金計算正常
- 程式設計師面試的標準答案並不標準程式設計師面試
- YouGov:2/5的英國社交網民看到過不準確的內容Go
- 雲端計算還有多久能夠替代高效能運算?
- PHP浮點數的精確計算BCMathPHP
- Java深海拾遺系列(5)--- 精度計算中的BigDecimal,double和floatJavaDecimal
- 標準成本計算和平均成本計算比較
- 淺談月出月落和月相的計算方法以及替代工具 - 月出月落和月相 APIAPI
- date.getMonth()方法的替代
- ORACLE analyse table方式收集表統計資訊導致SQL執行計劃不準確而效能下降OracleSQL
- MySQL如何計算重要的指標,來確定配置是否正確MySql指標