浮點型加減乘除(解決浮點型運算精度丟失問題)
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