摘要:浮點數沒有辦法是用二進制進行精確表示。我們的表示浮點數由兩個部分組成指數和尾數,這樣的表示方法一般都會失去一定的精確度,有些浮點數運算也會產生一定的誤差。浮點數的值實際上是由一個特定的數學公式計算得到的。
首先我們先來看如下代碼示例:
public class Test_1 { public static void main(String[] args) { System.out.println(0.06+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(303.1/1000); } }
運行結果如下。
? 0.06999999999999999
? 0.5800000000000001
? 401.49999999999994
? 0.30310000000000004
你認為你看錯了,但結果卻是是這樣的。問題在哪里呢?原因在于我們的計算機是二進制的。浮點數沒有辦法是用二進制進行精確表示。我們的CPU表示浮點數由兩個部分組成:指數和尾數,這樣的表示方法一般都會失去一定的精確度,有些浮點數運算也會產生一定的誤差。如:2.4的二進制表示并非就是精確的2.4。反而最為接近的二進制表示是 2.3999999999999999。浮點數的值實際上是由一個特定的數學公式計算得到的。
? 其實java的float只能用來進行科學計算或工程計算,在大多數的商業計算中,一般采用java.math.BigDecimal類來進行精確計算。
? 在使用BigDecimal類來進行計算的時候,主要分為以下步驟:
? 1、用float或者double變量構建BigDecimal對象。
? 2、通過調用BigDecimal的加,減,乘,除等相應的方法進行算術運算。
? 3、把BigDecimal對象轉換成float,double,int等類型。
? 一般來說,可以使用BigDecimal的構造方法或者靜態方法的valueOf()方法把基本類型的變量構建成BigDecimal對象。
BigDecimal b1 = new BigDecimal(Double.toString(0.48)); BigDecimal b2 = BigDecimal.valueOf(0.48);
對于常用的加,減,乘,除,BigDecimal類提供了相應的成員方法。
public BigDecimal add(BigDecimal value); //加法 public BigDecimal subtract(BigDecimal value); //減法 public BigDecimal multiply(BigDecimal value); //乘法 public BigDecimal divide(BigDecimal value); //除法
進行相應的計算后,我們可能需要將BigDecimal對象轉換成相應的基本數據類型的變量,可以使用floatValue(),doubleValue()等方法。
? 下面是一個工具類,該工具類提供加,減,乘,除運算。
public class Arith { /** * 提供精確加法計算的add方法 * @param value1 被加數 * @param value2 加數 * @return 兩個參數的和 */ public static double add(double value1, double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.add(b2).doubleValue(); } /** * 提供精確減法運算的sub方法 * @param value1 被減數 * @param value2 減數 * @return 兩個參數的差 */ public static double sub(double value1, double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.subtract(b2).doubleValue(); } /** * 提供精確乘法運算的mul方法 * @param value1 被乘數 * @param value2 乘數 * @return 兩個參數的積 */ public static double mul(double value1, double value2){ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.multiply(b2).doubleValue(); } /** * 提供精確的除法運算方法div * @param value1 被除數 * @param value2 除數 * @param scale 精確范圍 * @return 兩個參數的商 * @throws IllegalAccessException */ public static double div(double value1, double value2, int scale) throws IllegalAccessException{ //如果精確范圍小于0,拋出異常信息 if(scale<0){ throw new IllegalAccessException("精確度不能小于0"); } BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.divide(b2, scale).doubleValue(); } /** * 舍余 * @param value1 被除數 * @param value2 除數 * @param scale 精確范圍 * @return 兩個參數的商 * @throws IllegalAccessException */ public static BigDecimal div2(double value1, double value2, int scale) throws IllegalAccessException{ BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.divide(b2, scale, RoundingMode.FLOOR); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75622.html
摘要:使用,保證精度的同時,能精準的進行四舍六入計算。類精確的數學運算使用來實現精準度因為精度的原因構造方法的結果有一定的不可預知性,例如因此建議使用。算法規則四舍六入五考慮,五后非零就進一,五后皆零看奇偶,五前為偶應舍去,五前為奇要進一。 四舍六入計算 算法規則: 四舍六入五考慮, 五后非零就進一, 五后皆零看奇偶, 五前為偶應舍去, 五前為奇要進一。 使用BigDecimal,保證精度的...
摘要:返回的是是一個整數的最小值。筆記這個構造函數的結果可能有些不可預測。這是因為不能像或者作為任何有限長度的二進制分數精確地表示。當必須用作源為,注意,此構造提供了一個精確的轉換它不會將轉換為使用方法,然后使用構造函數相同的結果。 第三階段 JAVA常見對象的學習 BigInteger和BigDecimal類 BigInteger類 (一) 構造方法: //針對超過整數范圍的運算(整數最大...
摘要:然而表示這個是的鍋,我不背。的表示一共的數字位能存儲個,表示存儲兩位小數。因為默認是保留兩位小數,超過了精度,所以保存近似值。大范圍低精度存儲。很準確,采用科學計數法,損失精度,但能存儲更大范圍的數據,但是精度有損失。 BigDecimal 為什么要使用這個呢?簡單點說就是商業要求精度計算,而double計算出來的結果,往往出人意料。 例子 Double運算 showImg(https...
摘要:成員方法類概述用于產生隨機數成員方法正則表達式相關方法判斷功能分割功能替換功能獲取功能和類的使用類概述包含一些有用的類字段和方法。注意它不能被實例化,因為此類構造器是私有的成員方法類類概述表示特定的瞬間,精確到毫秒。 前言 我們都知道,JDK包含了JRE,而JRE中也提供了各種功能的java類,現在我們就對這些類有個簡單了解,然后靈活運用。 常用類:Object類/Scanner類,...
摘要:正則表達式的概述和簡單使用正則表達式是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。例如,在表達式中,存在四個這樣的組組零始終代表整個表達式。 1_正則表達式的概述和簡單使用 A:正則表達式 是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。其實就是一種規則。有自己特殊的應用。 作用:比如注冊郵箱,郵箱有用戶名和密碼,一般會對其限制長度,這個...
閱讀 3735·2021-11-22 13:52
閱讀 3615·2019-12-27 12:20
閱讀 2392·2019-08-30 15:55
閱讀 2148·2019-08-30 15:44
閱讀 2265·2019-08-30 13:16
閱讀 579·2019-08-28 18:19
閱讀 1890·2019-08-26 11:58
閱讀 3443·2019-08-26 11:47