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

珠海企业网站建设公司百度地图3d实景地图

珠海企业网站建设公司,百度地图3d实景地图,有什么有什么好的学做饮品的网站,做网站公司 陕西渭南前言 学java的肯定都知道,要保证小数运算精度不丢失我们得用BigDecimal对象。这篇文章就分析一下为什么用浮点数会造成精度丢失?BigDecimal是怎么解决精度丢失问题的?下面我们一起看看吧! 浮点数的表示 浮点数在计算机中通常采用 IEEE 75…

前言

学java的肯定都知道,要保证小数运算精度不丢失我们得用BigDecimal对象。这篇文章就分析一下为什么用浮点数会造成精度丢失?BigDecimal是怎么解决精度丢失问题的?下面我们一起看看吧!

浮点数的表示

浮点数在计算机中通常采用 IEEE 754 标准进行表示。这个标准将数值分为三个部分:符号位、指数部分和尾数部分。由于尾数的位数有限,某些小数(尤其是十进制小数)无法精确地用二进制表示。

精度丢失案例

public class FloatPrecision {public static void main(String[] args) {double a = 0.1;double b = 0.2;double c = a + b;System.out.println(c); // 输出 0.30000000000000004}
}

在这个例子中,尽管我们期望 c 的值为 0.3,但实际上它被计算为 0.30000000000000004。这种现象在浮点数运算中非常常见,尤其是在涉及多个浮点数的加减乘除时,误差可能会逐渐累积。

为什么浮点数不能精确表示小数呢?

了解了10进制小数转二进制过程,就知道为啥呢?

十进制小数转换成二进制小数采用"乘2取整,顺序排列法:
● 用2乘十进制小数,可以得到积
● 将积的整数部分取出,再用2乘余下的小数部分,又得到一个积
● 再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。
在这里插入图片描述
所以我们的浮点数计算存在精度丢失问题
在这里插入图片描述

0.00011001100110011…(循环)

BigDecimal 的解决方案

通过BigDecimal("0.1") 的String 构造不会造成精度丢失,避免构造函数用浮点数表示,上面已经说过了浮点数本身存在精度丢失的问题。BigDecimal是怎么解决精度丢失的呢?

BigDecimal是通过一个"无标度值"和一个"标度"来表示一个数的。

关键得三个参数:

public class BigDecimal extends Number implements Comparable<BigDecimal> {/*** The unscaled value of this BigDecimal, as returned by {@link* #unscaledValue}.** @serial* @see #unscaledValue*/private final BigInteger intVal;/*** The scale of this BigDecimal, as returned by {@link #scale}.** @serial* @see #scale*/private final int scale;  // Note: this may have any value, so// calculations must be done in longs/*** If the absolute value of the significand of this BigDecimal is* less than or equal to {@code Long.MAX_VALUE}, the value can be* compactly stored in this field and used in computations.*/private final transient long intCompact;

无标度值(Unscaled Value):这是一个整数,表示BigDecimal的实际数值。
标度(Scale):这是一个整数,表示小数点后的位数。
BigDecimal的实际数值计算公式为:unscaledValue × 10^(-scale)。

假设有一个BigDecimal表示的数值是123.45,那么无标度值(Unscaled Value)是12345。标度(Scale)是2。因为123.45 = 12345 × 10^(-2)。

当标度为正数时,它表示小数点后的位数。例如,在数字123.45中,他的无标度值为12345,标度是2。
当标度为零时,BigDecimal表示一个整数。
当标度为负数时,它表示小数点向左移动的位数,相当于将数字乘以 10 的绝对值的次方。
例如,一个数值为1234500,那么他可以用value是12345,scale为-2来表示,因为1234500 * 10^(-2) = 12345。
(当需要处理非常大的整数时,可以使用负数的标度来指定小数点左侧的位数。这在需要保持整数的精度而又不想丢失尾部零位时很有用。)

不能用BigDecimal的equals方法做等值

直接上源码吧:

    public boolean equals(Object x) {if (!(x instanceof BigDecimal)) {return false;} else {BigDecimal xDec = (BigDecimal)x;if (x == this) {return true;//比较标度} else if (this.scale != xDec.scale) {return false;} else {long s = this.intCompact;long xs = xDec.intCompact;if (s != -9223372036854775808L) {if (xs == -9223372036854775808L) {xs = compactValFor(xDec.intVal);}return xs == s;} else if (xs != -9223372036854775808L) {return xs == compactValFor(this.intVal);} else {return this.inflated().equals(xDec.inflated());}}}}

equals方法会比较标度,所以比较大小的话用 compareTo()比较吧

import java.math.BigDecimal;public class BigDecimalComparison {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("1.0");BigDecimal num2 = new BigDecimal("1.00");System.out.println("equals: " + num1.equlse(num2));       // 输出falseSystem.out.println("compareTo: " + num1.compareTo(num2)); // 输出: 0}
}

小结

因为某些十进制的小数在二进制中是一个无限循环的小数,所有用浮点数存在进度丢失问题。
BigDecimal采用标度的形式解决了精度丢失问题。同时在使用BigDecimal的时候,使用String的构造器。
最后在使用BigDecimal比较大小的时候不要使用equals,请用compareTo

ps: 收徒中,简历优化、学习计划制定、面试指导 可私我
云服务器,私我可返点

http://www.tj-hxxt.cn/news/15414.html

相关文章:

  • 网站做优化应该具备什么推广公司哪家好
  • 2015做外贸网站好做吗百度搜索收录
  • 苏州专业做网站较好的公司有哪些互联网最赚钱的行业
  • 做视频网站需要多少上传如何制作一个网址
  • 做网站非法吗登录百度app
  • 如何给网站做右侧导航网页在线客服免费版
  • 洛阳网站开发公司百度浏览器入口
  • 宁波网站推广平台咨询网站软文推广网站
  • 国内永久免费crm系统网站推荐大全百度关键词查询排名怎么查
  • 新手容易上手的cms做企业网站杭州seo工作室
  • 网站设计建设方案如何建立网上销售平台
  • 做网站颜色类型是啥最新疫情19个城市封城
  • 网站开发之美网页设计教程
  • 上海公司买车上牌规定山东seo优化
  • 网站论坛推广方案长沙关键词优化首选
  • 图书馆门户网站建设有哪些公司优秀网站网页设计
  • 做网站要注意些什么网络推广文案策划
  • e龙岩官网下载专业整站优化
  • 忆达城市建设游戏网站大数据营销是什么
  • 保网微商城app下载seo推广思路
  • seo课程哪个好上海网站seo外包
  • 深圳网站建设 设计贝尔百度推广客户端下载安装
  • 做网站的学校有哪些2022最新热点事件及点评
  • 流媒体网站开发教程seo合作
  • 彩票网站建设 极云seo云优化软件破解版
  • 网站运营做网页设计软文广告500字
  • 门户网站属于数字媒体吗腾讯控股第三季度营收1401亿
  • 源码之家进不去seo平台是什么
  • 江苏省质量建设厅网站谷歌商店安卓版下载
  • 好看又刺激不封号的直播百度点击优化