1. 程式人生 > >浮點型加減乘除(解決浮點型運算精度丟失問題)

浮點型加減乘除(解決浮點型運算精度丟失問題)

package dealNumber;

import java.math.BigDecimal;    

/**
 * 進行BigDecimal物件的加減乘除,四捨五入等運算的工具類   
 * 
 * @author Yuk
 */
public class DoubleArith {    

    /**   
    * 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精   
    * 確的浮點數運算,包括加減乘除和四捨五入。   
    */    
    //預設除法運算精度    
    private static final int DEF_DIV_SCALE = 10
; //這個類不能例項化 private DoubleArith(){ } /** * 提供精確的加法運算。 * @param v1 被加數 * @param v2 加數 * @return 兩個引數的和 */ public static double add(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new
BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精確的減法運算。 * @param v1 被減數 * @param v2 減數 * @return 兩個引數的差 */ public static double sub(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new
BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精確的乘法運算。 * @param v1 被乘數 * @param v2 乘數 * @return 兩個引數的積 */ public static double mul(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 * 小數點以後10位,以後的數字四捨五入。 * @param v1 被除數 * @param v2 除數 * @return 兩個引數的商 */ public static double div(double v1,double v2){ return div(v1,v2,DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 * 定精度,以後的數字四捨五入。 * @param v1 被除數 * @param v2 除數 * @param scale 表示表示需要精確到小數點以後幾位。 * @return 兩個引數的商 */ public static double div(double v1,double v2,int scale){ if(scale<0){ throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精確的小數位四捨五入處理。 * @param v 需要四捨五入的數字 * @param scale 小數點後保留幾位 * @return 四捨五入後的結果 */ public static double round(double v,int scale){ if(scale<0){ throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精確的型別轉換(Float) * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static float convertsToFloat(double v){ BigDecimal b = new BigDecimal(v); return b.floatValue(); } /** * 提供精確的型別轉換(Int)不進行四捨五入 * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static int convertsToInt(double v){ BigDecimal b = new BigDecimal(v); return b.intValue(); } /** * 提供精確的型別轉換(Long) * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static long convertsToLong(double v){ BigDecimal b = new BigDecimal(v); return b.longValue(); } /** * 返回兩個數中大的一個值 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 返回兩個數中大的一個值 */ public static double returnMax(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.max(b2).doubleValue(); } /** * 返回兩個數中小的一個值 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 返回兩個數中小的一個值 */ public static double returnMin(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.min(b2).doubleValue(); } /** * 精確對比兩個數字 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1 */ public static int compareTo(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2); } }

相關推薦

乘除解決運算精度丟失問題

package dealNumber; import java.math.BigDecimal; /** * 進行BigDecimal物件的加減乘除,四捨五入等運算的工具類 * * @author Yuk */ public clas

Javascript優化後的乘除解決js點數計算bug

說明 眾所周知,js在計算浮點數時候,結果可能會不準確。比如:(在chrome中的運算結果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.84

課後作業3----乘除

main stat string ane 課後作業 owin mina pan program //An addition program import javax.swing.JOptionPane; // import class JOptionPane public

用位運算實現四則運算之乘除用位運算求一個數的1/3 via Hackbuteer1

esp sub 沒有 正整數 過程 介紹 異或 sin 完成 轉自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位異或;&:按位與; | :按位或 計算機系統中,數值一律用補碼來表示:因為

用位運算實現四則運算之乘除用位運算求一個數的1/3

                聽同學百度二面中,不準用四則運算操作符來實現四則運算。一想就想到了計算機組成原理上學過的。位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。加法運算:int AddWithoutArithmetic(int num1,int num2){ if(n

7-10 算術入門之乘除 10 分

對於輸入的兩個整數,按照要求輸出其和差積商。 輸入格式: 在一行內輸入兩個不超過100的非負整數a和b,中間以一個空格間隔,且保證b不為0。 輸出格式: 共四行,格式是: [a] + [b] = [a+b] [a] - [b] = [a-b] [a] * [b] = [a*b

js處理點數的乘除

//浮點數加法運算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg2.t

leetcode 679. 24 Game 4個數乘除得到24 + 24遊戲 + 暴力求解

You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated through *, /, +, -, (, ) to ge

24遊戲是經典的紙牌益智遊戲。 常見遊戲規則: 從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。其中,J代表11,Q代表12,K代表13,A代表1,按照要求程式設計解決24遊戲

24點遊戲是經典的紙牌益智遊戲。 常見遊戲規則: 從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。 基本要求: 隨機生成4個代表撲克牌牌面的數字字母,程式自動列

java處理型別的乘除法出現小數點精度錯亂的解決方法

如果你在java裡面執行一下一段程式碼,你會發現會出現錯亂的小數點: double d1 = 100.0234; double d2 = 12.0652;

JS 乘除運算

動態控制 pan nbsp lac cnblogs oat 浮點 spa log //浮點數加法運算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString(

解決JS點數(小數)計算乘除的BUG

java 長度 誤差 spl function urn tofixed ccm catch 加法函數 /** ** 加法函數,用來得到精確的加法結果 ** 說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。

解決JS點數(小數)計算乘除的BUG-https://www.cnblogs.com/cynthia-wuqian/p/6432754.html

/****************************************解決JS浮點數(小數)計算加減乘除的BUG    Start****************************************/ /** ** 加法函式,用來得到精確的加法

大數計算進階 支援大點數的任意精度乘除

上一篇實現了大數加法,乘除法都是簡單的複用加法,這樣做時間複雜度高,精度低。進階:1.乘法模擬豎式計算方法 核心思路是num1[i]*num2[j]的結果一定對應乘積中的[i+j]位,並且考慮對[i+j+1]位的進位。    這樣的時間複雜度為O(m*n) 而簡單的複用加法的

Java Double乘除精確運算

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

大數模板乘除冪次開方

sizeof class struct 好用 char res 不知道 color span 很好用的模板,但當時做題的時候從哪裏找的不知道了,原作看到知會我一聲我補上hhh 1 struct BigInteger 2 { 3 int len; 4

精度丟失-解決方法(BigDecimal-乘除)

/** * 精度丟失問題解決方法 */ public static void main(String[] args) { double a = 1.0; double b = 0.9; System.out.println(a - b); // 解決精度丟失問題方法如下

劍指offer——不用乘除做加法按位與和異或

class Solution { public: int Add(int num1, int num2) { while(num2 != 0){//若需要進位 int sum = num1 ^ num2;//異或,01=1,00=0,11=

劍指offer系列十七求1+2+3+...+n,不用乘除做加法,把字串轉換成整數

求1+2+3+...+n 題目描述 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 解題思路: 法一:利用python的特性 法二:用兩個函式,一個遞迴,另一個終止遞迴。如果對n連續進

NumericUtil工具類實現數字及數字格式化的基本功能:精確的乘除法、金額數字轉 成中文等。

package com.cl.frame.clfbs.common; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text