小数数据精度问题Double与BigDecimal】的更多相关文章

做项目的过程中涉及到小数问题的时候,一般我都用Double类型,但是经常出现*.999999998这种数据,然后自己再手动四舍五入,简直傻的要死. 明明就是一个1.51-1.38的问题,很简单怎么会得出这么古怪的数?该怎么做才不出现这种数?答案就是BigDecimal. Double类型的数据使用二进制表示的,它不可能将0.1或者10的其他任何次负幂,精确表示为一个有限长度的二进制小数.所以1.51-1.38出现0.13000000000000012的结果,如果是涉及到金钱的项目,这肯定不行的,…
转自:http://superivan.iteye.com/blog/963628 [1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先提供一个例子就可以发现问题了: public class FloatNumberTester { public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0 - 0.42); System.out.pr…
项目遇到该问题 先上结论:不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一个float变量. 3,把这个float变量赋值给一个 BigDecimal对象,用的是BigDecimal的double参数的构造: new BigDecimal(double val) 4,把这个BigDecimal保存到MySQL数据库,字段类型是decimal(15,2). 这…
代码: double d = -123456789012345.3426;//5898895455898954895989; NumberFormat nf = new DecimalFormat("#0.###"); nf.setMinimumFractionDigits(3);// 小数点后不足的补零:小数点之后最多3位数字 String amt = nf.format(d);// 将double类型的数格式化并转换成字符串,实际上进行了四舍五入 System.out.printl…
先上结论:不要直接用double变量作为构造BigDecimal的参数! 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一个float变量. 3,把这个float变量赋值给一个 BigDecimal对象,用的是BigDecimal的double参数的构造: new BigDecimal(double val) 4,把这个BigDecimal保存到MySQL数据库,字段类型是decimal(15,2). 这段代码逻辑在线上…
Char初识 char: char类型是一个单一的 16 位 Unicode 字符 char 在java中是2个字节("字节"是byte,"位"是bit ,1 byte = 8 bit ) 最小值是 \u0000(即为0) 最大值是 \uffff(即为65,535) char 数据类型可以储存任何字符 例子:char letter = 'A' char是Java中的保留字,与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode.不过8位…
将Double类型的数据保留2位小数: Double a = 3.566; BigDecimal bd = new BigDecimal(a); Double d = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); d输出就是3.57, 四舍五入 将Double转String,并保留2位小数: 方法1. String a = "1.245"; Double d= Double.parseDouble(a); Decimal…
1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先提供一个例子就可以发现问题了: public class FloatNumberTester { public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.…
float f = 280.8f;System.out.println(f*100);结果是什么?结果是:28080.0f(我是这么想的)实际结果是:28079.998 既然float处理有问题换double会不会有问题呢?double f = 280.8d;System.out.println(f*100);结果是:28080.0结果神奇般的达到了预期!是不是换double就好了呢?再试一下double f = 280.71d;System.out.println(f*100);结果是:280…
转自:http://superivan.iteye.com/blog/963628 [1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先提供一个例子就可以发现问题了: public class FloatNumberTester { public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0 - 0.42); System.out.pr…