高精度的运算的NumberUtils

package com.zjt.frame;

import java.math.BigDecimal;

import org.apache.commons.lang3.StringUtils;

/** *  * 功能说明: 提供高精度的运算支持. 所以函数以double为参数类型,兼容int与float. *  * @author admin */public class NumberUtils {

private NumberUtils() {

}

/**    * 精确的加法运算.    *     * @param v1    * @param v2    * @return    */   public static double add(double v1, double v2) {      BigDecimal b1 = new BigDecimal(v1);      BigDecimal b2 = new BigDecimal(v2);      return b1.add(b2).doubleValue();   }

/**    *     * 精确的减法运算.    *     * @param v1    *            被减数    * @param v2    *            减数    */   public static double subtract(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 multiply(double v1, double v2) {      BigDecimal b1 = new BigDecimal(v1);      BigDecimal b2 = new BigDecimal(v2);      return b1.multiply(b2).doubleValue();   }

/**    * 提供精确的乘法运算,并对运算结果截位.    *     * @param v1    * @param v2    * @param scale    *            运算结果小数后精确的位数    * @return    */   public static double multiply(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(v1);      BigDecimal b2 = new BigDecimal(v2);      return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();   }

/**    * 提供(相对)精确的除法运算.    *     * @see #divide(double, double, int)    *     * @param v1    * @param v2    * @return    */   public static double divide(double v1, double v2) {      BigDecimal b1 = new BigDecimal(v1);      BigDecimal b2 = new BigDecimal(v2);      return b1.divide(b2).doubleValue();   }

/**    * 提供(相对)精确的除法运算. 由scale参数指定精度,以后的数字四舍五入.    *     * @param v1    *            被除数    * @param v2    *            除数    * @param scale    *            表示表示需要精确到小数点以后几位    */   public static double divide(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(v1);      BigDecimal b2 = new BigDecimal(v2);      return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();   }

/**    * 提供精确的小数位四舍五入处理.    *     * @param v    *            需要四舍五入的数字    * @param scale    *            小数点后保留几位    */   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(v);      return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();   }

/**    * 随机产生一个不大于max的随机整数    *     * @param max    * @return    */   public static long randomNumber(long max) {      long tmp = System.currentTimeMillis();      long x = tmp % max;      return x;   }

public static boolean isNumeric(String str) {      int dotCount = 0;      boolean result = true;      for (int i = str.length(); --i >= 0;) {         char c = str.charAt(i);         if (c == ‘.‘) {            dotCount++;            continue;         }

if (dotCount > 1) {            result = false;            break;         }

if (!Character.isDigit(str.charAt(i))) {            result = false;            break;         }      }      return result;   }

/**    * @desc 把金额由分转换成元    *     * @param sFenStr    *            金额(单位:分)    * @return 金额(单位:元)    */   public static String getYuanStr(String sFenStr) {      String Y = "0";// 元      String J = "0";// 角      String F = "0";// 分      int len = sFenStr.length();      if (len > 0) {         F = sFenStr.substring(len - 1, len);      }      if (len > 1) {         J = sFenStr.substring(len - 2, len - 1);      }      if (len > 2) {         Y = sFenStr.substring(0, len - 2);      }      return Y + "." + J + F;   }

/**    * 把金额由分转换成元 yb    *     * @param sFenStr    * @return    */   public static String getYuanStr2(String sFenStr) {      if (StringUtils.isNotBlank(sFenStr)) {         int i = Integer.valueOf(sFenStr);         double j = (double) i / 100;         return j + "";      }      return "0";   }

/**    * 将20120626164400 转换位2012年06月26日 16:44:00    *     * @param formateDate    * @return    */   public static String getFormatDate(String formateDate) {      String year = formateDate.substring(0, 4);      String month = formateDate.substring(4, 6);      String day = formateDate.substring(6, 8);      String hour = formateDate.substring(8, 10);      String min = formateDate.substring(10, 12);      String second = formateDate.substring(12);      return year + "年" + month + "月" + day + "日" + hour + ":" + min + ":" + second + "时";   }

/**    * 功能说明:将秒转换为分    *     * @param seconds    * @return    */   public static String getFormateFen(String seconds) {      if (StringUtils.isNotBlank(seconds)) {         int m = Integer.parseInt(seconds) / 60;         return m + "";      }      return "";   }

/**    * 功能说明:将KB转换为M    *     * @param strkb    * @return    */   public static String getFormateM(String strkb) {      if (StringUtils.isNotBlank(strkb)) {         int m = Integer.parseInt(strkb) / 1024;         return m + "";      }      return "";   }}

原文地址:https://www.cnblogs.com/jtz-79879/p/8526028.html

时间: 2024-10-12 21:41:19

高精度的运算的NumberUtils的相关文章

高精度浮点数运算

/* Name: 高精度浮点数运算 Copyright: Author: 巧若拙 Date: 08-11-14 10:17 Description: 本程序实现了高精度浮点数的加法,减法,乘法,乘方和除法运算,有效数字精确到MAX. 为了便于进位,本程序采用了较为独特的数据结构,即把浮点数分成整数和小数部分,分别存储在两个不同的数组中. 其中整数部分数字存储在ValInt[MAX-lenInt...MAX) ,小数部分数字存储在ValDec[1...lenDec],ValDec[0]用来存储进位

使用C++的string实现高精度加法运算

对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为string,设为s1和s2. 接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算). string reverseStr(string input){ string output = ""; for(int i = 0; i < input.length(); i++){

用C++实现高精度加法运算

先说说高精度运算的概念: 是指参与运算的数(加数,减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算.例如,求两个200位的数的和.这时,就要用到高精度算法了.(摘自百度百科). 再往下看之前,大家先列竖式计算35+86. 注意的问题: (1)运算顺序:两个数靠右对齐:从低位向高位运算:先计算低位再计算高位: (2)运算规则:同一位的两个数相加,然后再加上从低位来的进位,成为该位的和: 这个和再去掉向高位的进位就成为该位的值:如上例:3+8+1=12,向前一位进1,本位的

hdu 1715 大菲波数 高精度和运算,水

1.hdu 1715  大菲波数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1715 3.总结:水 #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b using nam

PHP高精度数学运算函数

bcadd: 将二个高精确度数字相加.bccomp: 比较二个高精确度数字.bcdiv: 将二个高精确度数字相除.bcmod: 取得高精确度数字的余数.bcmul: 将二个高精确度数字相乘.bcpow: 求一高精确度数字次方值.bcscale: 配置程序中所有 BC 函数库的默认小数点位数.bcsqrt: 求一高精确度数字的平方根.bcsub: 将二个高精确度数字相减.

高精度计算(二) /*高精度的加法运算*/

例 高精度加法运算 输入正整数 a 和 b,输出 a+b 的值.0<a,b<=10^250 输入: 第一行:a 第二行:b   输出:a+b 的和. 样例输入: 99    999 样例输出: 1098 分析: (1)加法运算      -- a[7]  a[6]  a[5]  a[4]  a[3]  a[2]  a[1] -+-   0      0    b[5]  b[4]  b[3]  b[2]  b[1] ----------------------------------    

洛谷P1080 国王游戏 高精度 贪心 数学推公式

洛谷P1080 国王游戏        数学推公式      高精度    贪心 然而这并不是我打出来的,抄题解... 将左手与右手的乘积从小到大排序,然后计算求最大值即可.(需要高精度) 证明: 1)知道,如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1.设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S. 则,ans1 = max{S / B[i], S * A[i] / B[i + 1]} 若交换

dp+高精度(洛谷1005 矩阵取数游戏NOIP 2007 提高第三题)

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2.每次取走的各个元素只能是该元素所在行的行首或行尾: 3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号): 4.游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分. 输入格式: 输入

【NOIP 2012 国王游戏】 贪心+高精度

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少