文档章节

金额,数值精确推荐BigDecimal,请勿使用double,float

尾生
 尾生
发布于 2016/08/10 15:12
字数 351
阅读 9
收藏 1

package com.text.java;

import java.math.BigDecimal;

/**
 * <p class="detail">
 * 功能:支付数字计算误差
 * </p>
 * @ClassName: PayDouble
 * @version V1.0  
 * @date 2016-8-10
 * @author wuxw
 */
public class PayDouble {
    
    public static void main1(String[] args) {  
        float f = 0.1f;  
        float sum = 0;  
        for( int i=0; i<1000000; i++)  
        {  
            sum += f;  
        }  
        System.out.println(sum);  
        // 输出:100958.34 而不是1000000
    }  
    
    //输出
    /**
     * <p class="detail">
     * 功能:0.29  
            28
     * </p>
     * @author wuxw
     * @param args
     * @throws
     */
    public static void main2(String[] args) {  
        double d = 29.0 * 0.01;  
        System.out.println(d);  
        System.out.println((int) (d * 100));  
    }
    
    
    public static void main(String[] args) {
         BigDecimal b1 = new BigDecimal(Double.toString(0.01));   
         BigDecimal total = new BigDecimal(Double.toString(0));   
         for( int i=0; i<1000000; i++)  
         {  
             total=total.add(b1);  
         }  
         System.out.println("BigDecimal total="+total);
         // 输出: 10000.00
    }
}

  1. BigDecimal(int)                 创建一个具有参数所指定整数值的对象。  
  2. BigDecimal(double)        创建一个具有参数所指定双精度值的对象。  
  3. BigDecimal(long)             创建一个具有参数所指定长整数值的对象。  
  4. BigDecimal(String)          创建一个具有参数所指定以字符串表示的数值的对象。

BigDecimal 的运算方式 不支持 + - * / 这类的运算 它有自己的运算方法:

  1. BigDecimal add(BigDecimal augend) 加法运算  
  2.     BigDecimal subtract(BigDecimal subtrahend) 减法运算  
  3.     BigDecimal multiply(BigDecimal multiplicand) 乘法运算  
  4.     BigDecimal divide(BigDecimal divisor) 除法运算  

© 著作权归作者所有

共有 人打赏支持
尾生
粉丝 15
博文 138
码字总数 54708
作品 0
杭州
程序员
金融系统中正确的金额计算及存储方式

image 昨天微信群里在讨论金额计算及存储的话题,今天特来结贴一下。 经典的精度丢失问题 Java中的类型float、double用来做计算会有精度丢失问题,下面来看下面的示例。 上面的程序输出结果是...

架构之路
2017/12/01
0
0
计算金额 财务计算 精确运算 BigDecimal用法详解

一、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算...

jerry__sun
2016/07/07
581
1
如果要求精确的答案,请避免使用float和double

float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果...

目翟
2013/11/19
0
3
java.math.BigDecimal保留两位小数,保留小数,精确位数

java保留两位小数问题: 方式一(四舍五入形式保留两位小数,注意模式ROUNDHALFUP): 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, BigD...

vshcxl
2016/10/27
2.2K
0
如果需要精确的答案,请避免使用float和double

float和double类型主要是为了科学计算和工程计算而设计的。它们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。它们并没有提供完全精确的结果。 ...

ksfzhaohui
2012/12/13
0
1

没有更多内容

加载失败,请刷新页面

加载更多

SingleNumber136 leetCode

Given a non-empty array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you im......

woshixin
17分钟前
0
0
String ,  StringBuffer ,  StringBuilder的区别

String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可...

tsmyk0715
58分钟前
2
0
区块链100讲:UTXO 和 Account 模型对比

在当前区块链世界中,主要有两种记录保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型,同样 CITA 也采用了 ...

HiBlock
今天
1
0
Vue中路由管理器Vue Router使用介绍(三)

一、路由定义添加动态参数定义 1.路由定义项,使用:xx 方式 定义动态参数 { path:'/user/:id/:name', name:'user', component:()=>import('./views/User.vue') ...

tianma3798
今天
1
0
从ibdata文件恢复mysql数据

DROP TABLE 恢复【一】 Recover InnoDB dictionary Percona Data Recovery Tool 单表恢复

IT--小哥
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部