当前位置: 首页 > news >正文

上海网站建设-目前企业网站所面临的困惑南宁seo怎么做优化团队

上海网站建设-目前企业网站所面临的困惑,南宁seo怎么做优化团队,网站英文联系我们,中国建筑工程人才网文章目录1、原因分析2、解决方法2.1、Java中使用 BigDecimal 类2.2、JavaScript 中解决计算精度丢失的问题3、使用建议1、原因分析 首先我们来看个反直觉的浮点数值计算 System.out.println(0.3*3);有的同学可能要问为啥不是0.9? 首先要知道为什么会产生这个问题…

文章目录

        • 1、原因分析
        • 2、解决方法
          • 2.1、Java中使用 BigDecimal 类
          • 2.2、JavaScript 中解决计算精度丢失的问题
        • 3、使用建议

1、原因分析

首先我们来看个反直觉的浮点数值计算

System.out.println(0.3*3);

在这里插入图片描述

有的同学可能要问为啥不是0.9?

首先要知道为什么会产生这个问题?我们知道计算机的底层世界都是由0和1组成的,而浮点数值就是采用二进制系统表示,常见两种基本的浮点类型: float 和 double。

其中单精度float为32位浮点数,1位符号,8位指数和23位尾数(小数部分)。

在这里插入图片描述

双精度double则为64位浮点数,1位符号,11位指数和52位尾数(小数部分)。

接下来我们先看下十进制小数转二进制的例子,例如将 0.3 转为二进制

0.3*2=0.6 //取整数0
0.6*2=1.2 //取整数1
0.2*2=0.4 //取整数0
0.4*2=0.8 //取整数0
0.8*2=1.6 //取整数1
0.6*2=1.2 //取整数1
0.2*2=0.4 //取整数0
0.4*2=0.8 //取整数0
0.8*2=1.6 //取整数1
......
二进制表示为:010011001......

可以看到计算开始循环,永远无法消除小数部分,根据精度不同会截取对应有效数字,所以小数的二进制有时候是不能精确的,就和我们十进制里不能准确表示1/3=0.33333333…是一个道理。

这种情况在计算时会造成了精度丢失,也就是舍入误差,对于金额计算会产生严重的后果。


2、解决方法

2.1、Java中使用 BigDecimal 类

我们先看下Java里面的BigDecimal类,构造方法如下

在这里插入图片描述

在这里插入图片描述

可以看到 BigDecimal 有好几个构造方法,BigDecimal(int)、BigDecimal(double)、BigDecimal(String)等,但是这里要保证精度不丢失,构造参数不要用double类型,因为double类型传入的时候本身就是不完全精确的。如下:

BigDecimal bd1=new BigDecimal("0.3");
BigDecimal bd2=new BigDecimal("3");
BigDecimal bd3=new BigDecimal(3);
System.out.println(bd1.multiply(bd2));
System.out.println(bd1.multiply(bd3));

在这里插入图片描述


扩展:在金融领域,也可以使用一些第三方库,例如

<dependency><groupId>org.javamoney</groupId><artifactId>moneta</artifactId><version>1.1</version>
</dependency>

里面的Money类对金额做了显性的抽象,增加了金额的单位,避免了直接使用 BigDecimal 踩一些坑。


2.2、JavaScript 中解决计算精度丢失的问题

解决方法:decimal.js

decimal.js为 JavaScript 提供十进制类型的任意精度数值,是使用的二进制来计算的,所以能解决js的精度问题。

官网:http://mikemcl.github.io/decimal.js
GitHub地址:https://github.com/MikeMcl/decimal.js

用法如下

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><script src='js/decimal.js'></script><script type="text/javascript">var a=0.3*3;console.log(a);var b=0.1+0.2;console.log(b);//使用decimallet a1 = new Decimal(0.3).mul(new Decimal(3));console.log(a1.toNumber());let b2 = new Decimal(0.1).add(new Decimal(0.2));console.log(b2.toNumber());</script></body>
</html>

结果如下:

在这里插入图片描述

// 加法
let c = new Decimal(a).add(new Decimal(b));
// 减法
let d = new Decimal(a).sub(new Decimal(b));
// 乘法
let e = new Decimal(a).mul(new Decimal(b));
// 除法
let f = new Decimal(a).div(new Decimal(b));

3、使用建议

针对浮点数值存储和计算,大佬超给大家简单罗列了以下几点看法,欢迎补充。

  • 禁止通过判断两个浮点数是否相等来控制某些业务流程:在比较浮点数时,由于存在误差,往往会出现意料之外的结果。

  • 整型存储其最小单位的值:在要求绝对精确表示的业务场景下,比如金融行业的货币表示,展示时可以转换成该货币的常用单位,比如人民币使用分存储,美元使用美分存储。

  • 数组保存小数部分的数据:在要求精确表示小数点位的业务场景下,比如圆周率要求存储小数点后 1000 位数字,使用单精度和双精度浮点数类型保存是难以做到的。

  • 数据库中保存小数时,推荐使用 decimal 类型



更多技术干货,请持续关注程序员大佬超。
原创不易,转载请注明出处。

http://www.yidumall.com/news/59247.html

相关文章:

  • 网站建设员课程男生短期培训就业
  • wordpress小工具里页面苏州seo关键词优化价格
  • 网站解决方案合肥网络关键词排名
  • 做网站有什么关于财务的问题黄页引流推广网站
  • 如何建立网站的快捷方式seo外包方案
  • 热门行业潍坊百度关键词优化
  • 学做电商那个网站好seo广州工作好吗
  • 心理健康网站建设论文网络培训seo
  • 做网站有什么好处吗怎么seo关键词优化排名
  • 怎样看一个网站是谁做的商丘网络推广外包
  • 我有域名和云服务器怎么做网站百度公司销售卖什么的
  • 好的外贸网站的特征如何做谷歌seo推广
  • 武胜县赛马镇建设小学学校网站seo tdk
  • 怀来县网站建设湖南网站建设效果
  • 网站开发需要什么宁德市安全教育平台
  • 西安网站推广优化如何做好线上营销
  • 网站开发参考文献期刊淘宝的前100个关键词排名
  • java可以做网站后台硬件优化大师下载
  • 网站建设哪家公司便宜关键词排名监控批量查询
  • 网站设计会存在什么问题学技术包分配的培训机构
  • 网站资源库建设报价福州百度快照优化
  • 20亿做网站徐州seo推广
  • 做网站宽度和长度布局免费推客推广平台
  • 网站建设哪里最好sem优化托管公司
  • 镇江网站优化公司百度写作助手
  • 大学生网站设计大作业免费发布信息网网站
  • 微商城建设购物网站网盘资源大全
  • 花溪建设村镇银行官方网站企业宣传标语
  • 河北网站优化企业在线培训系统
  • 网站注册商标属于哪一类网站市场推广