浮点数精确表示

 1 /**
 2  * 浮点数表示问题
 3  * @author husky
 4  */
 5 public class Change {
 6     public static void main(String[] args) {
 7         double num1 = 2.00;
 8         double num2 = 1.10;
 9         double num3 = 1.90;
10         // 结果:0.8999999999999999
11         System.out.println(num1 - num2);
12         // 0.10000000000000009
13         System.out.println(num1 - num3);
14         // 1.0
15         System.out.println((num1 - num2) + (num1 - num3));
16
17         System.out.printf("jdk5 printf : %.2f%n",num1 - num2);
18         //use BigDecimal(String): 0.90
19         //use BigDecimal(Double): 0.899999999999999911182158029987476766109466552734375
20         System.out.println("use BigDecimal(String): " + new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
21         System.out.println("use BigDecimal(Double): " + new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
22     }
23     /**
24      * 解析:
25      * java浮点数表示对于一些小数并不能精确的表示,只能表示成它的临界值;
26      * 但是这只是个别的,详细请参考别处
27      */
28
29     /**
30      * 解决:
31      *  获取在使用jdk 5.0之后,通过printf得到的是正确的结果,但是底层的问题依然存在
32      *  因此对于涉及需要非常精确的结果,使用浮点数并不合适,尤其是货币运算
33      *
34      *  方案1:
35      *  将运算进行扩大,使用int,long 进行运算,将2美元表示成200美分进行运算
36      *
37      *  方案2:
38      *  使用BigDecimal,但要注意使用BigDecimal(String)构造器,不要使用BigDecimal(Double)
39      *  后者与上面的情况类似的
40      */
41 }
时间: 2024-09-29 17:44:27

浮点数精确表示的相关文章

第二章 Java浮点数精确计算

1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用BigDecimal. 2.代码 package com.xxx.util; import java.math.BigDecimal; /** * 浮点数精准算法 */ public class BigDecimalArithUtil { private static final int DIV_SCAL

JS/PHP 浮点数精确运算

php浮点数精确运算 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd — 将两个高精度数字相加bccomp — 比较两个高精度数字,

php浮点数精确运算

bc是Binary Calculator的缩写.bc*函数的參数都是操作数加上一个可选的 [int scale],比方string bcadd(string $left_operand, string $right_operand[, int $scale]),假设scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd - 将两个高精度数字相加 bccomp - 比較两个高精度数字,返回-1, 0, 1

BigDecimal代替浮点数精确计算用法简介

浮点数 浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法. 浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入.一个浮点数a由两个数m和e来表示:a = m × b^e.在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储).m(即尾数)是形如±d.ddd...dd

php浮点数精确运算之bc系列函数

bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. 1 bcadd - 将两个高精度数字相加 2 bccomp - 比较两个高精度数字,返回-1,

js浮点数精确计算(加、减、乘、除)

<SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r

Java浮点数float和double精确计算的精度误差问题总结

1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字: double:2^5

浮点数问题

(1)浮点数是有理数的集合,有些有理数不能表示,会有舍去误差如0.1等. (2)浮点数可以表示的连续整数也是有限的. 有些脚本语言,比如awk,lua中都是使用浮点数来存储整数的,也就是说,我们在语言中使用的整数,在语言内部是使用浮点数来表示的.我们知道,浮点数的运算中通常存在着一定的误差,所以整数是否能被浮点数精确表示呢?答案是可以,不过不是所有范围的整数都可以被精确的表示.由于浮点数精度的问题,所以浮点数的分布也就呈现出非均匀分布. 先简单介绍一下一个常用的浮点数在计算机中的组成,最常用的浮

IEEE 754 浮点数的表示精度探讨

IEEE 754 浮点数的表示精度探讨 前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处.我曾经做过数值算法程序,虽然基本可用,但是被浮点数精度问题所困扰:事情过后,我花了一点时间搜集资料,并仔细研究,有些心得体会,愿意与大家分享,希望对IEEE 754标准中的二进制浮点数精度及其相关问题给予较为详尽的解释.当然,文中任何错误由本人造成,由我承担,特此声明. 1. 什么是IEEE 754标准? 目前支持二