精度丢失
来源:互联网 发布:加入网络作协要求 编辑:程序博客网 时间:2024/05/01 13:27
查看BigDecimal(double val)构造器时可以发现,使用该类构造器时有一定的不可预知性。当程序使用new BigDecimal构造器来创建一个对象,它的值并不是0.01,他实际上等于一个近似0.1数。这是因为0.1无法精确表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表面上等于该值)。
如果使用BigDecimal(String val)构造器的结果是可预知的——写入new BigDecimal("0.1");将创建一个BigDecimal,他正好等于预期的0.1。因此通常建议优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal的构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。
import java.math.BigDecimal;public class BigDecimalTest {public static void main(String[] args){BigDecimal f1=new BigDecimal("0.05");BigDecimal f2=BigDecimal.valueOf(0.01);BigDecimal f3=new BigDecimal(0.05);System.out.println("使用String作为BigDecimal构造器参数:");System.out.println("0.05+0.01="+f1.add(f2));System.out.println("0.05-0.01="+f1.subtract(f2));System.out.println("0.05*0.01="+f1.multiply(f2));System.out.println("0.05/0.01="+f1.divide(f2));System.out.println("使用double作为BigDecimal构造器参数");System.out.println("0.05+0.01="+f3.add(f2));System.out.println("0.05-0.01="+f3.subtract(f2));System.out.println("0.05*0.01="+f3.multiply(f2));System.out.println("0.05/0.01="+f3.divide(f2));}}
BigDecimal的真正用法
如果程序中要求对double浮点型数组进行加、减、乘、除基本运算,则需要先将double类型数值包装成BigDecimal对象,调用BigDecimal对象的方法执行运算后再将运算结果转换成double型变量。这是比较繁琐的过程,可以考虑以BigDecemal为基础定义一个Arith工具类
import java.math.BigDecimal;public class BigDecimalTest {public static void main(String[] args){BigDecimal f1=new BigDecimal("0.05");BigDecimal f2=BigDecimal.valueOf(0.01);BigDecimal f3=new BigDecimal(0.05);System.out.println("使用String作为BigDecimal构造器参数:");System.out.println("0.05+0.01="+f1.add(f2));System.out.println("0.05-0.01="+f1.subtract(f2));System.out.println("0.05*0.01="+f1.multiply(f2));System.out.println("0.05/0.01="+f1.divide(f2));System.out.println("使用double作为BigDecimal构造器参数");System.out.println("0.05+0.01="+f3.add(f2));System.out.println("0.05-0.01="+f3.subtract(f2));System.out.println("0.05*0.01="+f3.multiply(f2));System.out.println("0.05/0.01="+f3.divide(f2));}}
阅读全文
0 0
- 精度丢失
- 精度丢失
- ORACLE NUMBER丢失精度
- java精度丢失问题
- c++ float精度丢失
- float、double精度丢失
- PHP防止精度丢失
- float出现精度丢失
- 运算精度丢失和数值丢失问题
- 浮点类型运算精度丢失
- Js计算,精度丢失处理
- float丢失精度的问题
- 关于 pow 浮点精度丢失
- java之double精度丢失
- js加减乘除丢失精度问题
- 浮点数精度丢失问题
- java double精度丢失问题
- 浮点型运算精度丢失
- linux下git环境变量配置
- 单词翻转
- java对象和Map互转及测试
- Codeforces contest 787 recordings
- C++详解Leetcode:106. Construct Binary Tree from Inorder and Postorder Traversal
- 精度丢失
- Codeforces contest 376&375 recordings
- 母函数 入门 + 模板
- 适配器模式
- [PAT乙级]1070. 结绳(25)
- 求和符号(Σ,sigma)
- 支配集、覆盖集、独立集、匹配与着色
- Python的逻辑控制true/false和循环
- JavaScript单线程运行机制与并发模型