肇庆网站建设公司哪个好云南电商网站开发
web/
2025/10/6 2:01:07/
文章来源:
肇庆网站建设公司哪个好,云南电商网站开发,凡客模板wordpress,河北省建设机械协会网站首页无论在什么业务中#xff0c;钱?是非常重要的东西#xff0c;对账的时候一定要对的上#xff0c;不能这边少一分钱那边多一分钱。对于数值的计算#xff0c;尤其是小数#xff0c;floate和double都是禁止使用的。阿里强制要求存放小数时使用 decimal#xff0c;禁止使用… 无论在什么业务中钱?是非常重要的东西对账的时候一定要对的上不能这边少一分钱那边多一分钱。对于数值的计算尤其是小数floate和double都是禁止使用的。阿里强制要求存放小数时使用 decimal禁止使用 float 和 double。说明float 和 double 在存储的时候存在精度损失的问题很可能在值的比较时得到不正确的结果。如果存储的数据范围超过 decimal 的范围建议将数据拆成整数和小数分开存储。处理方式可以为mysql 可以用 decimal 如果你是用 java 在商业计算中我们要用 java.math.BigDecimal注意如果需要精确计算非要用String来构造BigDecimal不可那么到底是什么情况为什么我们的账户一会少一分一会多一分(往往是少一分)如何解决呢一个例子说明废话不多说当我们拿着一块钱去买了一根9毛的棒冰会发生啥本来只剩1毛钱就不多了老板还扣我0.000....0002分上图问题原因无论是我们本文提到的double还是float都是浮点数。在计算机科学中浮点(英语floating point缩写为FP)是一种对于实数的近似值数值表现法由一个有效数字(即尾数)加上幂数来表示通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值称为浮点数(floating-point number)。划重点⭐⭐⭐其实我觉得很好理解我们之前说过计算机计算加减乘除啊都是用的加法器实质都是二进制的加法处理。那么这里就有一个二进制表示的问题。试想428之流都是2的幂次方可以完美用二进制表示计算当然不会出现问题。对于0135之类也都可以用二进制来表示出来所以整数肯定是没问题的。但是对于小数呢1(2的0次方)、0.5(2的-1次方)、0.25(2的-2次方)、0.75(2的-1次方2的-2次方)那都是可以转换成二进制的小数但是如十进制的0.1就无法用二进制准确的表示出来(你用2的次方来凑凑)。因此只能使用近似值的方式表达。如果我们尝试着把10进制的0.1转化成二进制会怎么转呢在十进制中0.1如何计算出来的呢0.1 1 ÷ 10那么二进制中也是同理1 ÷ 1010我们回到小学的课堂来列竖式吧 0.000110011... ------------------1010 ) 1 00001010 ------11001010 ----100001010 -----11001010 ----10很显然除不尽除出了一个无限循环小数二进制的 0.0001100110011...有的同学表示怀疑这结果正确我写在这里当然正确啦前面标注了是二进制小数点后面一位就是-1次方依次计算我们的0.1是不是介于(2的-3次方)和(2的-4次方)之间那么显然是从小数点第四个开始有1。好了那么如何在计算机中表示这个无限不循环的小数呢只能考虑按照不同的精度保留不同的位数。我们知道float是单精度的(JAVA中是32位)double是双精度的(JAVA中是64位)。不同的精度其实就是保留的有效数字位数不同保留的位数越多精度越高。所以浮点数在Java中是无法精确表示的因为大部分浮点数转换成二进制是一个无限不循环的小数只能通过保留精度的方式进行近似表示。问题的解决String 构造方法是完全可预知的写入 newBigDecimal(0.1) 将创建一个 BigDecimal它正好等于预期的 0.1。因此比较而言通常建议优先使用String构造方法。使用BigDecimal(String val)//加法public static BigDecimal add(double v1, double v2){ BigDecimal b1 new BigDecimal(Double.toString(v1)); BigDecimal b2 new BigDecimal(Double.toString(v2));return b1.add(b2);}//减法public static BigDecimal sub(double v1,double v2){ BigDecimal b1 new BigDecimal(Double.toString(v1)); BigDecimal b2 new BigDecimal(Double.toString(v2));return b1.subtract(b2);}//乘法public static BigDecimal mul(double v1,double v2){ BigDecimal b1 new BigDecimal(Double.toString(v1)); BigDecimal b2 new BigDecimal(Double.toString(v2));return b1.multiply(b2);}//除法public static BigDecimal div(double v1,double v2){ BigDecimal b1 new BigDecimal(Double.toString(v1)); BigDecimal b2 new BigDecimal(Double.toString(v2));return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小数,应对除不尽的情况}那么上面的精度丢失问题就迎刃而解了。但是除不尽怎么办比如10.0除以这里的3.0保留小数点后三位有效数字那么每个用户得到的都是3.333元三个用户加起来是得不到10块钱的。对于除法始终会产生除不尽的情况怎么办有个词叫轧差什么意思呢举个简单例子。假如现在需要把10元分成3分如果是10除以3这么除会发现为3.33333无穷尽的3。这些数字完全无法在程序或数据库中进行精确的存储。简单理解就是当除不尽或需去除小数点的时候前面的n-1笔(这里n3)做四舍五入。最后一笔做兜底(总金额减去前面n-1笔之和)。这样保证总金额的不会丢失。比如10块钱三个用户分前面两个用户只能各分到3.333块钱最后一个用户分到3.334块钱。保证总额不变。是不是感觉很机智好了我们可以准确地管理我们的钱了。不过针对这个钱的问题更机智的我选择保存钱的时候用分为单位来操作和保存能少一事就少一事吧。当然了有的时候必须用到小数的时候请记住我们该如何使用哦~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87682.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!