由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法,我这个不会(我估计能有方法不以科学计数法显示) 其中用到的知识就是中缀表达式转后缀表达式,我是从这里学的: http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 下面上代码吧: 这个方法需要一个参数,String类型公式,形如:"1…
最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品下,某个属性超标了,需要加价,但每一个属性的加价方式都不一样,针对每一家客户加多少价也不一样,每个时间点加价比率也可能不一样,真实情况要比这个复杂不少,这里就不再深入讨论. 那么应对这种需求,我首先想到的关键点是:要把加价这个公式,暴露给实际能控制它的人员去输入,把公式中需要用到的一些参数,以替代符…
前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工作. 这是仓库地址:仓库地址 BigDecimal的构建 一般而言,我们主要从int,long,double,float来进行计算,在构建的时候推荐使用 BigDecimal BigDecimal(String s); 因为通过double构造会损失精度,而String构造是固定的值. 创建以下方法…
java的数字运算,偶尔会出现精度的问题,以下阐述的 java的BigDecimal类的使用. 例如: System.out.println(0.9+0.3); 结果1.2 System.out.println(1.9+0.3); 结果2.1999999999999997 System.out.println(1.9+0.4); 结果2.3 java为了让float或者double类型能够精确的计算,提供了BigDecimal类. 示例如下: public static BigDecimal g…
[From] https://blog.csdn.net/stevene/article/details/586089 问题提出 (1).浮点数精确计算 胜利油田三流合一项目中一直存在一个问题,就是每次报表统计的物资金额和实际的金额要差那么几分钱,和实际金额不一致,让客户觉得总是不那么舒服,原因是因为我们使用java的浮点类型double来定义物资金额,并且在报表统计中我们经常要进行一些运算,但Java中浮点数(double.float)的计算是非精确计算,请看下面一个例子: System.ou…
BigDecimal通常在涉及到精确计算的时候会用到,下面是自己多次错误使用BigDecimal的总结. 结论: BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal("0.1"); BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小. BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimal divide(BigDecimal…
package com.wzh.test; import java.math.BigDecimal; public class test { /** * @param args */ public static void main(String[] args) { // double a=0.1; // double b=0.006; // System.out.println(a+b); BigDecimal a=new BigDecimal("0.1235235235263236236236…
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created by qing on 2017/3/28. */ public class AgeUtils { // 根据年月日计算年龄,birthTimeString:"1994-11-14" public static int getAgeFromBirthTime(String birthTimeS…
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位…
最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解就可以,但是当你写了一个四重for循环后你会发现解不出来.由此考虑到结果可能是小数,便把增量改成了float类型,每次自增0.1. 当你写完满心欢喜地运行的时候会发现还是出不来结果.再改成double类型也同样是不行. 这是因为java中float类型相加是把十进制转化为二进制后相加然后把二进制结果…