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

网站设计网站设计网站设计微信做网站的弊端

网站设计网站设计网站设计,微信做网站的弊端,有建网站的公司吗,个人网站开发是学什么语言文章目录 BigDecimal概述BigDecimal常见陷阱1.使用BigDecimal的构造函数传入浮点数2.使用equals()方法进行数值比较3.使用不正确的舍入模式 总结#xff1a; BigDecimal概述 BigDecimal 是 Java 中的一个类#xff0c;用于精确表示和操作任意精度的十进制数。它提供了高精度的… 文章目录 BigDecimal概述BigDecimal常见陷阱1.使用BigDecimal的构造函数传入浮点数2.使用equals()方法进行数值比较3.使用不正确的舍入模式 总结 BigDecimal概述 BigDecimal 是 Java 中的一个类用于精确表示和操作任意精度的十进制数。它提供了高精度的数值计算并且可以避免浮点数计算中常见的精度丢失问题。 它提供了大量的方法来支持基本的数学运算如加法、减法、乘法、除法等。它还支持比较操作和取整操作可以设置小数位数、舍入模式等。此外BigDecimal 还提供了一些其他功能如转换为科学计数法、格式化输出、判断是否是整数等。 适用场景需要处理精确计算或防止浮点数计算精度丢失的场景。 BigDecimal常见陷阱 1.使用BigDecimal的构造函数传入浮点数 其实这个问题我们在使用Float、Double等浮点类型进行计算时也会经常遇到比如说下面这个代码 Test public void bigDecimalDemo1() {float float1 1;float float2 0.9f;System.out.println(float1 - float2); }输出结果是多少呢0.1不是输出结果是0.100000024。因为 0.9 无法被精确表示为有限位数的二进制小数。在转换为二进制时可能会产生近似值。因此在进行减法运算时实际上是对近似值进行计算而不是对准确的 0.9 进行计算。这导致了精度丢失最终的计算结果也是一个近似值。因此输出结果不是准确的 0.1而是一个近似值。 小伙伴肯定能想到使用BigDecimal来避免这个问题这时候第一个需要避免的陷阱就来了。看以下代码 Test public void bigDecimalDemo2(){BigDecimal bigDecimal1 new BigDecimal(0.01);BigDecimal bigDecimal2 BigDecimal.valueOf(0.01);System.out.println(bigDecimal1 bigDecimal1);System.out.println(bigDecimal2 bigDecimal2); }输出结果如下 bigDecimal1 0.01000000000000000020816681711721685132943093776702880859375 bigDecimal2 0.01观察输出结果我们可以知道使用BigDecimal时同样会有精度的问题。所以我们在创建BigDecimal对象时有初始值使用BigDecimal.valueOf()的方式可以避免出现精度问题。 为什么会出现差异 在使用new BigDecimal()实际上是将 0.01 转换为二进制近似值并将其存储为 BigDecimal 对象。因此结果中存在微小的误差即输出结果为0.01000000000000000020816681711721685132943093776702880859375。 而BigDecimal.valueOf()不同其内部是先将double转为String因此不存在精度问题。 public static BigDecimal valueOf(double val) {// Reminder: a zero double returns 0.0, so we cannot fastpath// to use the constant ZERO. This might be important enough to// justify a factory approach, a cache, or a few private// constants, later.return new BigDecimal(Double.toString(val)); }TIPS 使用整数或长整数作为参数构造 ○ BigDecimal(int val)使用一个 int 类型的整数值创建 BigDecimal。 ○ BigDecimal(long val)使用一个 long 类型的整数值创建 BigDecimal。使用字符串作为参数构造 ○ BigDecimal(String val)使用一个字符串表示的数值创建 BigDecimal。该字符串可以包含整数部分、小数部分和指数部分。使用双精度浮点数作为参数构造 ○ BigDecimal(double val)使用一个 double 类型的浮点数值创建 BigDecimal。注意由于浮点数精度可能丢失建议使用字符串或其他方法构造 BigDecimal以避免精度损失问题。使用基于 BigInteger 的构造方法 ○ BigDecimal(BigInteger val)使用一个 BigInteger 对象来创建 BigDecimal。 2.使用equals()方法进行数值比较 日常项目我们是如何进行BigDecimal数值比较呢使用equals方法还是compareTo方法如果使用的是equals方法那就需要注意啦。看一下示例 Test public void bigDecimalDemo3(){BigDecimal bigDecimal1 new BigDecimal(0.01);BigDecimal bigDecimal2 new BigDecimal(0.010);System.out.println(bigDecimal1.equals(bigDecimal2));System.out.println(bigDecimal1.compareTo(bigDecimal2)); }输出结果如下 false 0观察结果可以知道使用equals比较结果是不相等的compareTo的结果为0代表两个数相等 ● compareTo实现了Comparable接口比较的是值的大小返回的值为-1-小于0-等于1-大于。 为什么equals返回的是false public boolean equals(Object x) {if (!(x instanceof BigDecimal))return false;BigDecimal xDec (BigDecimal) x;if (x this)return true;if (scale ! xDec.scale)return false;long s this.intCompact;long xs xDec.intCompact;if (s ! INFLATED) {if (xs INFLATED)xs compactValFor(xDec.intVal);return xs s;} else if (xs ! INFLATED)return xs compactValFor(this.intVal);return this.inflated().equals(xDec.inflated()); }我们观察equals的实现逻辑可以知道BigDecimal重写了equals方法重写后的关键代码 if (scale ! xDec.scale)return false;也就是会比较两个数值的精度精度不同返回false。 3.使用不正确的舍入模式 使用BigDecimal进行运算时一定要正确的使用舍入模式避免舍入误差引起的问题并且有时候出现结果是无限小数程序会抛出异常比如说 Test public void bigDecimalDemo4(){BigDecimal bigDecimal1 new BigDecimal(1.00);BigDecimal bigDecimal2 new BigDecimal(3.00);BigDecimal bigDecimal3 bigDecimal1.divide(bigDecimal2);System.out.println(bigDecimal3); }输出结果如下 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.简单的来说如果在除法运算过程中其结果是一个无限小数而操作的结果预期是一个精确的数字那么将会抛出ArithmeticException异常。 此时我们只要正确指定结果精度即可 Test public void bigDecimalDemo4(){BigDecimal bigDecimal1 new BigDecimal(1.00);BigDecimal bigDecimal2 new BigDecimal(3.00);BigDecimal bigDecimal3 bigDecimal1.divide(bigDecimal2, 2, RoundingMode.HALF_UP);System.out.println(bigDecimal3); }输出结果如下 0.33TIPS ● RoundingMode.UP向远离零的方向舍入 ● RoundingMode.DOWN向靠近零的方向舍入 ● RoundingMode.CEILING向正无穷方向舍入 ● RoundingMode.FLOOR向负无穷方向舍入 ● RoundingMode.HALF_UP四舍五入如果舍弃部分大于等于 0.5 ● RoundingMode.HALF_DOWN四舍五入如果舍弃部分大于 0.5 ● RoundingMode.HALF_EVEN银行家舍入法遵循 IEEE 754 标准 总结 ● 尽量使用字符串而非浮点类型来构造 BigDecimal 对象以避免浮点数转换精度问题。 ● 如果无法避免使用浮点类型则可使用 BigDecimal.valueOf 方法来构造初始化值以确保精确表示。 ● 比较两个 BigDecimal 值的大小时使用 compareTo 方法。如果需要严格限制精度的比较可以考虑使用 equals 方法。 ● 在进行 BigDecimal 运算前明确指定精度和舍入模式。使用 setScale 方法设置精度使用 setRoundingMode 方法设置舍入模式。
http://www.yutouwan.com/news/102849/

相关文章:

  • 应用中心下载seo优化要做什么
  • 网站源码 下载杭州网络推广运营公司
  • 计算机网络技术网站建设方向工业设计是干什么的
  • 广州 海珠 建网站企业信息公示信息
  • 娱乐网站开发spspwkh5免费制作平台无水印
  • 正能量视频不打马赛克网站seo优化方案设计
  • 百度建站多少钱wordpress 文章编辑器
  • 网站运营要会什么技术字体网站
  • 怎么在网站标题做logo鸿运通网站建设怎么样
  • 苏州吴江保洁公司c盘优化大师
  • 长沙手机网站建设公司排名wordpress 主题语言
  • 镜子厂家东莞网站建设寻花问柳专注做一家男人最爱的网站
  • 网站建设 意见征集外贸网站个人简介
  • 网站在只有域名了无锡装修网站
  • 游戏开发网站开发网站wordpress错误
  • 网站美工做图推荐wordpress 禁用更新
  • 做网站那个服务器好网站建设后期服务协议
  • 双流建设局网站想换掉做网站的公司
  • seo 整站优化沈阳做网站好的
  • 做微博网站好不好传智播客网页平面设计
  • 文山网站建设联系电话wordpress无法将上传的文件移动至
  • 网站建设新的技术手机端怎么变成电脑端
  • 上海网络做网站公司网页搜索屏蔽广告
  • 网站标签名词php源码项目 门户网站开发
  • 网站的备案号在哪内乡微网站建设
  • 网站没有问题但是一直做不上首页wordpress响应式主题设计
  • icp备案需要先建设网站么新建网站百度怎么收录
  • 佛山新网站建设案例贵州互联网公司
  • 用ps做租房网站里的图标大小门户模板
  • 招聘网站做沙龙php 网站开发框架ap