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

选择网站建设公司网站建设有哪些知识点

选择网站建设公司,网站建设有哪些知识点,如何用模板建站,余姚公司做网站在Java开发中#xff0c;涉及金额计算、科学计数或需要高精度数值处理时#xff0c;你是否遇到过这样的困惑#xff1f;用double计算0.1加0.2#xff0c;结果竟不是0.3#xff1b;用float存储商品价格#xff0c;小数点后两位莫名多出几位乱码#xff1b;甚至在金融系统…在Java开发中涉及金额计算、科学计数或需要高精度数值处理时你是否遇到过这样的困惑用double计算0.1加0.2结果竟不是0.3用float存储商品价格小数点后两位莫名多出几位乱码甚至在金融系统中微小的精度误差可能导致账目不平……这些问题的根源都指向Java基本数值类型在处理高精度场景时的天然缺陷。而解决这类问题的“终极武器”正是Java提供的BigDecimal类。本文将从底层逻辑出发结合代码示例与真实业务场景带你彻底掌握BigDecimal的核心用法与避坑指南。一、为什么需要BigDecimal从浮点数的精度困境说起 要理解BigDecimal的存在意义首先需要明白Java中float和double的“先天不足”。这两个类型属于浮点数Floating-Point Number采用IEEE 754标准存储其本质是通过“符号位指数位尾数位”的二进制形式近似表示十进制数。这种存储方式在大多数场景下足够高效但面对需要绝对精确的十进制小数时会暴露致命问题。 举个简单的例子我们都知道0.1是一个精确的十进制小数但它的二进制表示却是无限循环的0.0001100110011…。当double存储0.1时只能截取尾数位的一部分导致存储值与实际值存在微小误差。这种误差在单次计算中可能可以忽略但在多次累加、乘除或金融场景中如利息计算、分账会被放大最终导致结果偏离预期。 我们可以用一段代码验证这一点 public class FloatPrecisionDemo {public static void main(String[] args) {double a 0.1;double b 0.2;System.out.println(a b); // 输出0.30000000000000004} }运行这段代码控制台会输出0.30000000000000004而非预期的0.3。这正是浮点数精度丢失的典型表现。 此时BigDecimal的价值便凸显出来。它通过基于整数的十进制表示内部存储为unscaled value整数和scale小数点位数彻底避免了二进制浮点数的近似问题能够精确表示任意精度的十进制小数是金融、医疗、科研等对数值精度要求极高场景的首选方案。二、BigDecimal的核心概念与初始化从构造方法到最佳实践 1. 核心概念unscaled value与scale BigDecimal的内部结构由两部分组成 unscaled value一个大整数代表去掉小数点后的数值。例如数值12.34的unscaled value是1234。scale小数点的位数。例如12.34的scale是2表示小数点后两位。 这种设计使得BigDecimal可以通过调整scale来精确控制数值的小数位数同时通过大整数存储避免精度丢失。 2. 初始化方法 BigDecimal提供了多种构造方法但不同的初始化方式可能导致截然不同的结果。其中最需要注意的是避免直接使用double初始化。 我们通过代码对比三种常见初始化方式 public class BigDecimalInitDemo {public static void main(String[] args) {// 方式1通过String初始化推荐BigDecimal num1 new BigDecimal(0.1);System.out.println(String构造 num1); // 输出0.1// 方式2通过double初始化不推荐BigDecimal num2 new BigDecimal(0.1);System.out.println(double构造 num2); // 输出0.1000000000000000055511151231257827021181583404541015625// 方式3通过整数/长整型初始化安全BigDecimal num3 new BigDecimal(123);System.out.println(整数构造 num3); // 输出123} }运行结果中double构造的num2输出了一长串小数这是因为double本身存储的0.1已经是二进制近似值BigDecimal会忠实保留这个近似值的所有精度信息导致结果与预期不符。 最佳实践 优先使用new BigDecimal(String)构造确保输入的十进制数被精确解析。如果必须从double转换例如外部接口返回的double值建议先通过Double.toString(double)转为字符串再构造BigDecimal避免直接使用double构造方法。整数或长整型可以直接构造不会有精度问题。三、核心操作详解加减乘除与精度控制 BigDecimal的核心操作围绕四则运算展开但与基本数值类型不同的是它需要显式处理精度和舍入模式Rounding Mode尤其是除法操作。 1. 加减乘简单直接的精确计算 加法add、减法subtract、乘法multiply的逻辑相对简单BigDecimal会自动保留运算后的精度即结果的scale为两个操作数scale之和或差。例如 BigDecimal a new BigDecimal(1.23); // scale2 BigDecimal b new BigDecimal(4.5); // scale1 BigDecimal sum a.add(b); // 结果为5.73scale2 BigDecimal product a.multiply(b); // 结果为5.535scale3这里需要注意a.add(b)不会修改a或b本身BigDecimal是不可变类而是返回一个新的BigDecimal对象。 2. 除法必须处理的精度与舍入模式 除法divide是BigDecimal中最容易出错的操作因为两个数相除可能得到无限循环小数如1/30.333…此时必须显式指定精度保留小数位数和舍入模式否则会抛出ArithmeticException。 divide方法的常用重载形式 // 指定精度和舍入模式的除法 BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)我们通过一个示例演示 public class BigDecimalDivideDemo {public static void main(String[] args) {BigDecimal a new BigDecimal(1);BigDecimal b new BigDecimal(3);// 错误示例未指定精度和舍入模式抛出ArithmeticException// BigDecimal result1 a.divide(b); // 正确示例保留2位小数四舍五入BigDecimal result2 a.divide(b, 2, RoundingMode.HALF_UP);System.out.println(result2); // 输出0.33// 保留3位小数向上取整BigDecimal result3 a.divide(b, 3, RoundingMode.UP);System.out.println(result3); // 输出0.334} }常见的舍入模式包括 RoundingMode.HALF_UP四舍五入最常用类似数学中的“四舍六入五成双”。RoundingMode.UP向上取整向绝对值更大的方向舍入。RoundingMode.DOWN向下取整直接截断不进位。RoundingMode.HALF_EVEN银行家舍入法四舍六入五取偶数金融场景常用减少累计误差。 3. 精度调整setScale的使用 除了在除法中指定精度BigDecimal还提供了setScale方法用于主动调整数值的小数位数。例如将1.2345保留两位小数并四舍五入 BigDecimal num new BigDecimal(1.2345); BigDecimal scaledNum num.setScale(2, RoundingMode.HALF_UP); System.out.println(scaledNum); // 输出1.23注意实际是1.23不1.2345保留两位四舍五入是1.23不1.2345的第三位是4所以是1.23不1.2345的第三位是4第四位是5哦原数是1.2345即小数点后四位2第1位、3第2、4第3、5第4。保留两位小数时看第三位是4小于5所以舍去结果是1.23或者我是不是搞反了不1.2345保留两位小数第三位是4所以四舍五入后是1.23。如果是1.2355第三位是5才会进一位到1.24。这里需要注意setScale同样会返回新对象原对象不会被修改。四、进阶场景与注意事项从业务开发到性能优化 1. 高频业务场景金融、电商与科学计算 BigDecimal的典型应用场景包括 金融系统利息计算、分账、汇率转换要求精确到小数点后4-8位。电商系统商品价格计算如满减、折扣避免浮点数误差导致的价格异常。科学计算实验数据统计、物理公式推导需要高精度数值保证结果可靠性。 以电商的“满100减10”活动为例假设商品价格为99.9元double存储可能为99.89999999999999用double计算99.90.1会得到100.0但用BigDecimal可以确保计算的绝对精确避免因精度问题导致的优惠无法触发或过度触发。 2. 不可变性与性能优化 BigDecimal是不可变类类似String每次运算都会生成新对象。这在高频计算场景如循环中处理大量数据可能导致内存占用过高。此时可以通过以下方式优化 预先定义舍入模式和精度将常用的MathContext包含精度和舍入模式缓存避免重复创建。MathContext mc new MathContext(2, RoundingMode.HALF_UP); // 保留2位小数四舍五入 BigDecimal result a.divide(b, mc); // 使用MathContext简化调用批量操作合并将多次独立运算合并为一次复合运算减少对象创建次数。考虑基本类型替代如果业务允许一定精度损失如统计类场景可以权衡使用double以提升性能。 3. 比较数值equals与compareTo的区别 BigDecimal的equals方法不仅比较数值大小还比较scale小数位数。例如 BigDecimal a new BigDecimal(1.0); BigDecimal b new BigDecimal(1.00); System.out.println(a.equals(b)); // 输出falsescale不同 System.out.println(a.compareTo(b)); // 输出0数值相等因此比较两个BigDecimal的数值大小应使用compareTo方法而equals仅在需要严格判断数值和精度完全一致时使用如校验配置中的精确数值。五、常见误区用double直接构造BigDecimal 如前所述new BigDecimal(0.1)会保留double的二进制近似值导致结果与预期不符。正确做法是用字符串或Double.toString()转换后构造。除法不指定舍入模式 未指定舍入模式且结果为无限小数时divide会抛出ArithmeticException。所有除法操作必须显式指定精度和舍入模式或使用MathContext。忽略BigDecimal的不可变性 错误地认为a.add(b)会修改a的值实际上需要用新变量接收结果a a.add(b)。误用equals比较数值 如前所述equals会比较scale应使用compareTo判断数值大小。空指针异常NPE BigDecimal的方法如add不允许传入null参数调用前需确保对象非空或使用Optional包装。
http://www.pierceye.com/news/218999/

相关文章:

  • 域名注册没有网站美食网页设计素材图片
  • wordpress网站在哪里修改密码ps做网站要求高吗
  • 企业网站带商城源码Audiology wordpress
  • 星月教你做网站东营城乡建设局官网
  • 镇江网站建设开发旺店通erp系统
  • 体育直播网站建设深圳制作小程序
  • 手机微信管理系统搜索引擎优化的流程是什么
  • 壁纸公司网站源码做网站价格表
  • 潜江网站设计商务科技网站建设
  • 合肥企业网站制作网站开发公司简介
  • 德州市建设小学网站文员工作内容
  • 网站域名买卖营销技巧第三季在线观看
  • 西宁市公司网站建设比较网站建设
  • 深圳网站设计公司建设部人才网站
  • 广水住房和城乡建设部网站巅峰网站建设
  • 建设智能家居网站SWOT分析商业网站有哪些
  • 相亲网站男人拉我做外汇h5特效网站欣赏
  • 网站一个多少钱有什么做同城的网站
  • 网站 改版 方案wordpress谷歌字体 4.9
  • 全网引流推广 价格网站百度关键词seo排名优化
  • 信用门户网站建设规范win7 iis 发布asp.net网站
  • 织梦网站添加视频教程如何套用wordpress的源码
  • 网站服务器模式wordpress安装后只有英文版
  • 企业网站建设晋升wordpress 自助建站
  • 网站建设案例建站资源
  • 四大商业网站镇江制作网站的
  • 做网站系统学校宠物交易网站模板
  • 佛山市官网网站建设哪家好瑶海合肥网站建设
  • 微网站app建筑图片大全高清
  • 贵阳金阳网站建设公司网站开发与维护书