1. 程式人生 > >JAVA中精確的浮點運算

JAVA中精確的浮點運算

java中浮點運算對於很多值浮點數都是採用其能夠表示的離目標值最近的數來表示,這有可能會在計算中帶來不易覺察的誤差。

如下所例:

public class ssss {

	public static void main(String[] ages){
		double d1=2.07;
		double d2=1.03;
		System.out.println(d1+d2);
	}
}

結果:

雖然計算結果離精確值誤差很小,但其不是精確的!這在像如金融計算一樣計算精確度要求很高的領域是無法接受的,但這是二進位制本身的問題,而計算機普遍採用二進位制表示,使用基本資料型別無法解決。

為了解決基本資料型別浮點數不能進行精確計算的問題,Java中專門提供了java.math.BigDecimal類,其提供浮點數的精確計算功能。與BigInteger類相同,其運算操作均使用方法呼叫完成

demo

public class ssss {

	public static void main(String[] ages){
		BigDecimal b1=new BigDecimal("2.07");
		BigDecimal b2=new BigDecimal("1.03");
		System.out.println("相加運算:");
		System.out.println("b1:"+b1);
		System.out.println("b2:"+b2);
		System.out.println("相加值:"+b1.add(b2));
		
	}
}

輸出值:

其餘函式參造下表

 BigDecimal abs()
          返回 BigDecimal,其值為此 BigDecimal 的絕對值,其標度為 this.scale()。
 BigDecimal abs(MathContext mc)
          返回其值為此 BigDecimal 絕對值的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal add(BigDecimal augend)
          返回一個 BigDecimal,其值為 (this + augend),其標度為 max(this.scale(), augend.scale())。
 BigDecimal add(BigDecimal augend, MathContext mc)
          返回其值為 (this + augend) 的 BigDecimal(根據上下文設定進行舍入)。
 byte byteValueExact()
          將此 BigDecimal 轉換為 byte,以檢查丟失的資訊。
 int compareTo(BigDecimal val)
          將此 BigDecimal 與指定的 BigDecimal 比較。
 BigDecimal divide(BigDecimal divisor)
          返回一個 BigDecimal,其值為 (this / divisor),其首選標度為 (this.scale() - divisor.scale());如果無法表示準確的商值(因為它有無窮的十進位制擴充套件),則丟擲 ArithmeticException。
 BigDecimal divide(BigDecimal divisor, int roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。
 BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。
 BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。
 BigDecimal divide(BigDecimal divisor, MathContext mc)
          返回其值為 (this / divisor) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。
 BigDecimal[] divideAndRemainder(BigDecimal divisor)
          返回由兩個元素組成的 BigDecimal 陣列,該陣列包含 divideToIntegralValue 的結果,後跟對兩個運算元計算所得到的 remainder。
 BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
          返回由兩個元素組成的 BigDecimal 陣列,該陣列包含 divideToIntegralValue 的結果,後跟根據上下文設定對兩個運算元進行舍入計算所得到的 remainder 的結果。
 BigDecimal divideToIntegralValue(BigDecimal divisor)
          返回 BigDecimal,其值為向下舍入所得商值 (this / divisor) 的整數部分。
 BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
          返回 BigDecimal,其值為 (this / divisor) 的整數部分。
 double doubleValue()
          將此 BigDecimal 轉換為 double。
 boolean equals(Object x)
          比較此 BigDecimal 與指定的 Object 的相等性。
 float floatValue()
          將此 BigDecimal 轉換為 float。
 int hashCode()
          返回此 BigDecimal 的雜湊碼。
 int intValue()
          將此 BigDecimal 轉換為 int。
 int intValueExact()
          將此 BigDecimal 轉換為 int,以檢查丟失的資訊。
 long longValue()
          將此 BigDecimal 轉換為 long。
 long longValueExact()
          將此 BigDecimal 轉換為 long,以檢查丟失的資訊。
 BigDecimal max(BigDecimal val)
          返回此 BigDecimal 和 val 的最大值。
 BigDecimal min(BigDecimal val)
          返回此 BigDecimal 和 val 的最小值。
 BigDecimal movePointLeft(int n)
          返回一個 BigDecimal,它等效於將該值的小數點向左移動 n 位。
 BigDecimal movePointRight(int n)
          返回一個 BigDecimal,它等效於將該值的小數點向右移動 n 位。
 BigDecimal multiply(BigDecimal multiplicand)
          返回一個 BigDecimal,其值為 (this × multiplicand),其標度為 (this.scale() + multiplicand.scale())。
 BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
          返回其值為 (this × multiplicand) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal negate()
          返回 BigDecimal,其值為 (-this),其標度為 this.scale()。
 BigDecimal negate(MathContext mc)
          返回其值為 (-this) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal plus()
          返回 BigDecimal,其值為 (+this),其標度為 this.scale()。
 BigDecimal plus(MathContext mc)
          返回其值為 (+this) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal pow(int n)
          返回其值為 (thisn) 的 BigDecimal,準確計算該冪,使其具有無限精度。
 BigDecimal pow(int n, MathContext mc)
          返回其值為 (thisn) 的 BigDecimal。
 int precision()
          返回此 BigDecimal 的精度。
 BigDecimal remainder(BigDecimal divisor)
          返回其值為 (this % divisor) 的 BigDecimal。
 BigDecimal remainder(BigDecimal divisor, MathContext mc)
          返回其值為 (this % divisor) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal round(MathContext mc)
          返回根據 MathContext 設定進行舍入後的 BigDecimal。
 int scale()
          返回此 BigDecimal 的標度。
 BigDecimal scaleByPowerOfTen(int n)
          返回其數值等於 (this * 10n) 的 BigDecimal。
 BigDecimal setScale(int newScale)
          返回一個 BigDecimal,其標度為指定值,其值在數值上等於此 BigDecimal 的值。
 BigDecimal setScale(int newScale, int roundingMode)
          返回一個 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。
 BigDecimal setScale(int newScale, RoundingMode roundingMode)
          返回 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。
 short shortValueExact()
          將此 BigDecimal 轉換為 short,以檢查丟失的資訊。
 int signum()
          返回此 BigDecimal 的正負號函式。
 BigDecimal stripTrailingZeros()
          返回數值上等於此小數,但從該表示形式移除所有尾部零的 BigDecimal。
 BigDecimal subtract(BigDecimal subtrahend)
          返回一個 BigDecimal,其值為 (this - subtrahend),其標度為 max(this.scale(), subtrahend.scale())。
 BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
          返回其值為 (this - subtrahend) 的 BigDecimal(根據上下文設定進行舍入)。
 BigInteger toBigInteger()
          將此 BigDecimal 轉換為 BigInteger。
 BigInteger toBigIntegerExact()
          將此 BigDecimal 轉換為 BigInteger,以檢查丟失的資訊。
 String toEngineeringString()
          返回此 BigDecimal 的字串表示形式,需要指數時,則使用工程計數法。
 String toPlainString()
          返回不帶指數字段的此 BigDecimal 的字串表示形式。
 String toString()
          返回此 BigDecimal 的字串表示形式,如果需要指數,則使用科學記數法。
 BigDecimal ulp()
          返回此 BigDecimal 的 ulp(最後一位的單位)的大小。
 BigInteger unscaledValue()
          返回其值為此 BigDecimal 的非標度值 的 BigInteger。
static BigDecimal valueOf(double val)
          使用 Double.toString(double) 方法提供的 double 規範的字串表示形式將 double 轉換為 BigDecimal。
static BigDecimal valueOf(long val)
          將 long 值轉換為具有零標度的 BigDecimal。
static BigDecimal valueOf(long unscaledVal, int scale)
          將 long 非標度值和 int 標度轉換為 BigDecimal。

相關推薦

Java Double加減乘除精確運算

package org.nutz.mvc.core; import java.math.BigDecimal; public class Arith {// 原始檔Arith.java:/*** 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精 確的浮點

java金額(表示)的計算

 java中進行金額的計算經常浮點數丟失精度,造成這種問題的原因應該與cpu對浮點數的計算方式有關,有下面的介紹:從原理上來講,任何一門語言對於浮點數的計算都是不精確的。因為現在的Computer都是基於二進位制數來儲存計算的。例如計算8+3時,Computer會轉換為二進位

JAVA精確運算

java中浮點運算對於很多值浮點數都是採用其能夠表示的離目標值最近的數來表示,這有可能會在計算中帶來不易覺察的誤差。 如下所例: public class ssss { public static void main(String[] ages){ double d

MatlabFLOPS函式計算運算次數

Matlab中FLPOS函式可以計算程式碼中需要的實際浮點運算次數,不過新版本的Matlab已將該函式移除,所幸找到一個替代的解決方案。 參考 https://www.mathworks.com/matlabcentral/fileexchange/50608-counting-the

shell指令碼如何處理運算

bash中不能處理浮點運算 let只能處理整數運算 要想處理浮點運算,可以藉助bc 或者 awk #!/bin/bash num="0.5" num1="6" #sacle用於控制小數點後出現的位數 tmp=$(echo "scale=2;$n

c語言運算的inf和nan錯誤

============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版權沒有,但是轉載請保留此段宣告 ===============================

JS準確的運算

將如下程式碼,拷貝到檔案myMath.js檔案中,在相應的頁面進行引用: <script type="text/javascript" src="../js/myMath.js"></script> 即可呼叫相應的加減乘除運算了. 示例js程式碼

圖解計算機的數值範圍和運算

## 寫在前面 在【程式設計師進階系列】專題的《[圖解計算機中資料的表示形式](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490388&idx=1&sn=1805a62814452c598c567e65de27

Java的三目運算

java 簡單 tro div 組成 分支 p s center 結構 Java中的三目運算符 Java中的三目運算符: 有些選擇分支結構,可以使用簡單的條件運算符來代替. 如: if(a<b) min=a; else min=b; //可以用下面

你真的會用java的三目運算符嗎

tmp nbu mar bce dft class eth 黃金 fzu 我也慨嘆不已,想我當初15級裝備王者黃金弓時攻擊力才達到180,現在要是到了15級再裝備的話,攻擊力就遠遠不是那麽低了! 一陣動亂之後,大約十幾個水晶螃蟹的仇恨立刻全部被吸引了過去,我立刻眼疾手快的換

java的三目運算

ava 基礎 system ring args 復習 value println 代碼 直接上代碼!復習基礎! public static void main(String args[]){ int a , b; a = 10;

Java的三目運算符可能出現的問題

-m add 運算符 inline test orm JD borde lean 你真的了解Java中的三目運算符嗎? 原創 2018-04-27 刨根問底的 Hollis Hollis Hollis 微信號 hollischuang 功能介紹 一個對Coding有

匯編,運算符,fldpi,fmul等指令說明.

位數 進位 定義 分別是 而在 跳轉 pat 集中 訪問內存 協處理器指令系統 協處理器共有68條不同的指令,匯編程序在遇到協處理器指令助記符時,都會將其轉換成機器語言的ESC指令,ESC指令代表了協處理器的操作碼。 協處理器指令在執行過程中,需要訪問內存單元時,CPU

Nodejs學習筆記(十七)—運算decimal.js

學習筆記 存儲 log title ron 學習 decimal 安裝 bit 前言   開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾   JavaScript 只有一種數字類型 ( Number )    JavaScript采用

Java的賦值運算

結果 out sta ima spa 操作數 color info 慕課 賦值運算符是指為變量或常量指定數值的符號。如可以使用 “=” 將右邊的表達式結果賦給左邊的操作數。 Java 支持的常用賦值運算符,如下表所示: 1 pub

Java的程式碼和程式碼單元

這篇文章講的很細,但是對於初學者也很難理解,在後面的筆記中,我會陳述自己的簡單理解。    摘要     本文介紹 Java 平臺支援增補字元的方式。增補字元是 Unicode 標準中程式碼點超出 U+FFFF

IEEE編碼計算

float型別在記憶體中佔4位元組,最高位表示符號位,剩下31位,從右向左取8位用於表示指數,其餘用於表示尾數 在進行二進位制轉化前,需要進行科學記數法轉換,具體步驟如下 1.看符號位,正數為0,負數為1 2.將數轉化為相應的二進位制數 3.用科學記數法轉化為相應

js運算精度問題和IEEE754

原文連結 當我們使用一段時間的JS之後會遇到下面這個問題 0.1 + 0.2 === 0.3 // false 我們可以在控制檯裡面看到0.1+0.2輸出的並不是0.3而是0.30000000000000004。那麼為什麼出現這樣的問題呢。 其實

js運算bug的解決辦法

//除法函式,用來得到精確的除法結果 //說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函式返回較為精確的除法結果。 //呼叫:accDiv(arg1,arg2) //返回值:arg1除以arg2的精確結果function accDiv(arg1,arg2){     v

javaDouble型別的運算精度丟失的問題 (小數點多出99999999999999)

 在使用Java,double 進行運算時,經常出現精度丟失的問題,總是在一個正確的結果左右偏0.0000**1。 特別在實際專案中,通過一個公式校驗該值是否大於0,如果大於0我們會做一件事情,小於0我們又處理其他事情。 這樣的情況通過double計算出來的結果去和0比較