首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

精密度运算

2013-12-06 
精度运算/* *Title:MathUtil.java *Company: ytx inc*/package com.guangcai.helperimport java.io.Buffe

精度运算

/* *Title:MathUtil.java *Company: ytx inc  */package com.guangcai.helper;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.math.BigDecimal;import java.net.HttpURLConnection;import java.net.URL;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public final class MathUtil {protected final static Logger log = LoggerFactory.getLogger(MathUtil.class);private static final int DEF_DIV_SCALE = 10;private static final int NUM_MUL_COUNT = 10000;/** * 提供精度的比较运算 *  * @param v1 * @param v2 * @return * 小于、等于或大于时,返回 -1、0 或 1。 */public static int compareTo(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(round(v1,10)));BigDecimal b2 = new BigDecimal(Double.toString(round(v2,10)));return b1.compareTo(b2);}public static int compareTo(double v1, double v2,int decimals) {v1 = MathUtil.round(v1, 3);v2 = MathUtil.round(v2, 3);BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.compareTo(b2);}/** *  * 提供精确的加法运算。 *  * @param v1 *            被加数 *  * @param v2 *            加数 *  * @return 两个参数的和 */public static double add(double v1, double ... v2) {BigDecimal b = new BigDecimal(Double.toString(v1));for(int i=0;i<v2.length;i++){BigDecimal v3 = new BigDecimal(Double.toString(v2[i]));b = b.add(v3);}return b.doubleValue();}/** *  * 提供精确的减法运算。 *  * @param v1 *            被减数 *  * @param v2 *            减数 *  * @return 两个参数的差 */public static double sub(double v,double...v1) {BigDecimal b = new BigDecimal(Double.toString(v));for(int i=0;i<v1.length;i++){BigDecimal v3 = new BigDecimal(Double.toString(v1[i]));b = b.subtract(v3);}return b.doubleValue();}/** *  * 提供精确的乘法运算。 *  * @param v1 *            被乘数 *  * @param v2 *            乘数 *  * @return 两个参数的积 */public static double mul(double v1, double ... v2) {BigDecimal b = new BigDecimal(Double.toString(v1));for(int i=0;i<v2.length;i++){BigDecimal v3 = new BigDecimal(Double.toString(v2[i]));b = b.multiply(v3);}return b.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));//log.info("b1="+b1+",b2="+b2);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");if (scale > 4) {StringBuffer sb = new StringBuffer();sb.append("0.");for (int i = 0; i < scale; i++) {sb.append("0");}String str = sb.toString();return Double.valueOf(new java.text.DecimalFormat(str).format(b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue()));}return Double.valueOf(new java.text.DecimalFormat("0.0000").format(b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue()));}/** *  * 乘long。 *  * @param v *            long*10000 *  * @param scale *             *  * @return  */public static long longMul(long number) {return number*NUM_MUL_COUNT;}/** *  * 提供精确的LONG加法运算。 *  * @param v1 *            被加数 *  * @param v2 *            加数 *  * @return 两个参数的和 */public static long add(long v1, long ... v2) {long b = longMul(v1);for(int i=0;i<v2.length;i++){long v3 = longMul(v2[i]);b += v3;}return b;}/** *  * 提供精确的LONG减法运算。 *  * @param v1 *            被减数 *  * @param v2 *            减数 *  * @return 两个参数的差 */public static long sub(long v,long...v1) {long b = longMul(v);for(int i=0;i<v1.length;i++){long v3 = longMul(v1[i]);b = b-v3;}return b;}/** *  * 提供精确的LONG乘法运算。 *  * @param v1 *            被乘数 *  * @param v2 *            乘数 *  * @return 两个参数的积 */public static long mul(long v1, long ... v2) {long b = longMul(v1);for(int i=0;i<v2.length;i++){long v3 = longMul(v2[i]);b = b*v3;}return b;}public static void main(String[] arg) {//System.out.println(mul(1,2,1));}}

热点排行