`
strawren
  • 浏览: 47010 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在Java中如何确定浮点数的精度,以及格式化(地域化)

阅读更多

格式化输出数字
有时我们需要控制输出的数字的格式,如何使用java的类库做到这个呢?
也许你不关心格式,但是你需要关心你的程序可以在全世界通用,像下面的这样一个简单的语句是依赖地区的:
    System.out.println(1234.56);
在美国,"." 是小数点,但在其它地方就不一定了。如何处理这个呢?

//保留小数点后两位小数
public double Number2(double pDouble)
{
  BigDecimal  bd=new  BigDecimal(pDouble);
  BigDecimal  bd1=bd.setScale(2,bd.ROUND_HALF_UP);
  pDouble=bd1.doubleValue();
  long  ll = Double.doubleToLongBits(pDouble);
  return pDouble;
}
格式化输出数字
翻译:Cherami
email:cherami@163.net
原文:http://developer.java.sun.com/developer/TechTips/2000/tt0411.html
* 格式化输出数字
格式化输出数字
有时我们需要控制输出的数字的格式,如何使用java的类库做到这个呢?
也许你不关心格式,但是你需要关心你的程序可以在全世界通用,像下面的这样一个简单的语句是依赖地区的:
    System.out.println(1234.56);
在美国,"." 是小数点,但在其它地方就不一定了。如何处理这个呢?

java.text 包中的一些包可以处理这类问题。下面的简单范例使用那些类解决上面提出的问题:

    import java.text.NumberFormat;

    import java.util.Locale;

    public class DecimalFormat1 {

        public static void main(String args[]) {

            // 得到本地的缺省格式

            NumberFormat nf1 = NumberFormat.getInstance();

            System.out.println(nf1.format(1234.56));

            // 得到德国的格式

            NumberFormat nf2 =

                NumberFormat.getInstance(Locale.GERMAN);

            System.out.println(nf2.format(1234.56));

        }

    }

如果你在美国,运行程序后输出:

    1,234.56

    1.234,56

换句话说,在不同的地方使用不同的习惯表示数字。

NumberFormat.getInstance ()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格式化一个数字。你也可以使用非缺省的地区设置,例如德国。然后格式化方法根据特定的地区规则格式化数字。这个程序也可以使用一个简单 的形式:

    NumberFormat.getInstance().format(1234.56)

但是保存一个格式然后重用更加有效。国际化是格式化数字时的一个大问题。

另一个是对格式的有效控制,例如指定小数部分的位数,下面是解决这个问题的一个简单例子:

    import java.text.DecimalFormat;

    import java.util.Locale;

    public class DecimalFormat2 {

        public static void main(String args[]) {

            // 得到本地的缺省格式

            DecimalFormat df1 = new DecimalFormat("####.000");

            System.out.println(df1.format(1234.56));

            // 得到德国的格式

            Locale.setDefault(Locale.GERMAN);

            DecimalFormat df2 = new DecimalFormat("####.000");

            System.out.println(df2.format(1234.56));

        }

    }

在这个例子中设置了数字的格式,使用像"####.000"的符号。这个模式意味着在小数点前有四个数字,如果不够就空着,小数点后有三位数字,不足用0补齐。程序的输出:

    1234.560

    1234,560


相似的,也可以控制指数形式的格式,例如:

    import java.text.DecimalFormat;

    public class DecimalFormat3 {

        public static void main(String args[]) {

            DecimalFormat df = new DecimalFormat("0.000E0000");

            System.out.println(df.format(1234.56));

        }

    }

输出:

    1.235E0003

对于百分数:

    import java.text.NumberFormat;

    public class DecimalFormat4 {

        public static void main(String args[]) {

            NumberFormat nf = NumberFormat.getPercentInstance();

            System.out.println(nf.format(0.47));

        }

    }

输出:

    47%

至此,你已经看到了格式化数字的几个不同的技术。另一方面,如何读取并解析包含格式化的数字的字符串?解析支持包含在NumberFormat中。例如:

    import java.util.Locale;

    import java.text.NumberFormat;

    import java.text.ParseException;

    public class DecimalFormat5 {

        public static void main(String args[]) {

            // 本地格式

            NumberFormat nf1 = NumberFormat.getInstance();

            Object obj1 = null;

            // 基于格式的解析

            try {

                obj1 = nf1.parse("1234,56");

            }

            catch (ParseException e1) {

                System.err.println(e1);

            }

            System.out.println(obj1);

            // 德国格式

            NumberFormat nf2 =

                NumberFormat.getInstance(Locale.GERMAN);

            Object obj2 = null;

            // 基于格式的解析

            try {

                obj2 = nf2.parse("1234,56");

            }

            catch (ParseException e2) {

                System.err.println(e2);

            }

            System.out.println(obj2);

        }

    }

这个例子分两部分,都是解析一个字符串:"1234,56"。第一部分使用本地格式解析,第二部分使用德国格式解析。当程序在美国运行,结果是:

    123456

    1234.56

换句话说,"1234,56"在美国被认为是一个巨大的整数"123456"而在德国被认为是一个小数"1234.56"。

还有格式化讨论的最后一个问题。在上面的例子中, DecimalFormat 和 NumberFormat 都被使用了。DecimalFormat 常用于获得很好的格式控制,而NumberFormat 常用于指定不同于本地的地区。如何结合两个类呢?

答 案围绕着这样的事实:DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此,你可以使用 NumberFormat.getInstance 指定一个地区,然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用,但是你需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。下面是一个这样的例子:

    import java.text.DecimalFormat;

    import java.text.NumberFormat;

    import java.util.Locale;

    public class DecimalFormat6 {

        public static void main(String args[]) {

            DecimalFormat df = null;

            // 得到一个NumberFormat 对象并

            // 强制转换为一个 DecimalFormat 对象

            try {

                df = (DecimalFormat)

                    NumberFormat.getInstance(Locale.GERMAN);

            }

            catch (ClassCastException e) {

                System.err.println(e);

            }

            // 设置格式模式

            df.applyPattern("####.00000");

            // format a number

            System.out.println(df.format(1234.56));

        }
    }

getInstance() 方法获得格式,然后调用applyPattern()方法设置格式模式,输出:

    1234,56000

如果你不关心国际化,可以直接使用DecimalFormat 。
分享到:
评论

相关推荐

    java 精确的浮点数运算java 精确的浮点数运算java 精确的浮点数运算

    java 精确的浮点数运算java 精确的浮点数运算java 精确的浮点数运算 java 精确的浮点数运算java 精确的浮点数运算java 精确的浮点数运算 java 精确的浮点数运算java 精确的浮点数运算java 精确的浮点数运算 java ...

    java 精确的浮点数运算 工具类 java 精确的浮点数运算 工具类

    java 精确的浮点数运算 工具类 java 精确的浮点数运算 工具类java 精确的浮点数运算 工具类 java 精确的浮点数运算 工具类java 精确的浮点数运算 工具类 java 精确的浮点数运算 工具类java 精确的浮点数运算 工具类 ...

    浮点数精度问题解答——浮点数

    浮点数精度问题在计算机科学中是一个至关重要的概念,尤其对于进行数值计算的开发者来说,理解和掌握浮点数的表示和精度误差至关重要。本文将详细阐述IEEE 754标准,这一标准对浮点数的表示和计算进行了规范,旨在...

    浮点数(单精度浮点数,双精度浮点数)

    在 C++ 中,浮点数有六种:float(单精度)、unsigned float(单精度无符号)、double(双精度)、unsigned double(双精度无符号)、long double(高双精度)和 unsigned long double(高双精度无符号)。...

    关于浮点数的精度问题

    在 IEEE754 的浮点数存储格式中,float 类型的浮点数占 32 位,double 类型的浮点数占 64 位。float 类型的浮点数可以分为三部分:符号位(1位)、指数位(8位)和尾数位(23位)。double 类型的浮点数也可以分为三...

    JAVA中浮点数的运算

    这篇博客主要探讨了Java中浮点数(包括`float`和`double`类型)运算的特性、存在的问题以及如何应对这些挑战。 首先,Java中的`float`类型占用32位存储空间,它能表示大约6到7位十进制的有效数字,而`double`类型则...

    C语言中浮点数精度问题分析.pdf

    在C语言编程中,浮点数精度问题是一个常见的问题,它涉及到计算机科学基础中的数值表示方法。由于计算机采用二进制系统存储数据,这使得计算机在处理十进制小数时会出现精度误差。理解这些误差产生的原因是极为重要...

    S7-200SMART_双精度浮点数转换为单精度浮点数库文件及使用说明.rar

    浮点数在计算机中分为单精度浮点数(32位,IEEE 754标准)和双精度浮点数(64位,同样遵循IEEE 754)。双精度浮点数提供更高的精度,但占用更多存储空间。在处理大量数据或资源有限的设备(如S7-200SMART)时,可能...

    单精度浮点数转Modbus协议十六进制格式.rar

    在工业自动化领域,Modbus协议是一种广泛使用的通信协议,它允许设备...通过使用"单精度浮点数转Modbus协议十六进制格式.vi",用户可以在实际应用中轻松处理这种转换,确保数据在遵循Modbus协议的系统间的正确通信。

    对S7-200PLC双精度浮点数转单精度浮点数例程的一点补充

    本篇文章主要探讨了如何在S7-200 PLC中处理双精度浮点数转换为单精度浮点数的问题,这对于管理智能电表、远传水表等远程抄表系统的数据一致性至关重要。双精度浮点数提供了更高的精度,但在处理能力有限的S7-200 PLC...

    Java中浮点数精度问题的解决方法

    总的来说,Java中解决浮点数精度问题的关键是使用BigDecimal类,并且要注意构造方法的选择,避免在转换过程中引入额外的精度损失。在编写涉及金融计算或需要高度精确性的程序时,使用BigDecimal是最佳实践。同时,...

    双精度浮点数转换

    在计算机科学中,浮点数是一种用于表示数值的近似方式,主要分为单精度浮点数和双精度浮点数。这些数据类型广泛应用于各种计算,特别是在需要处理大量精确度和范围的数学运算中,例如科学计算、图像处理和游戏开发。...

    c语言浮点数高精度加法计算

    c语言浮点数高精度加法计算

    浮点数的内存格式,分单精度和双精度

    浮点数在计算机科学中扮演着至关重要的角色,它们用于表示和处理科学计算、工程问题以及各种需要精确小数部分的数值操作。浮点数在内存中的存储方式分为两种主要格式:单精度(Single Precision)和双精度(Double ...

    Java中实现浮点数的精确计算

    ### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型...通过上述方法,可以在Java中实现浮点数的精确计算,解决因精度问题导致的误差。在实际开发中,根据应用场景选择合适的解决方案非常重要。

    单精度&双精度浮点数与十六进制数相互转换

    在实际编程中,大多数编程语言如C++、Java、Python等都提供了内置函数来进行浮点数和十六进制之间的转换。例如,在Python中,可以使用`float.hex()`和`float.fromhex()`方法实现这一过程。 理解这些转换机制对编程...

    浮点数精度问题

    在Java中,`double`类型是按照双精度浮点数标准来实现的,它有11位指数和53位尾数。尽管53位看似足够大,但在某些运算中,即使是简单的小数相加也可能因为精度损失而产生不预期的结果。例如,`0.1 + 0.2 != 0.3`在...

    解决javascript中的浮点数计算不精确问题

    5. **使用BigDecimal类**:在某些高级应用中,可以考虑使用类似Java的`BigDecimal`类,它提供了高精度的浮点数运算,但JavaScript原生并不支持,可能需要引入第三方库。 理解JavaScript浮点数计算的局限性并采用...

    浮点数精度.vi

    浮点数精度

    疯狂Java讲义 浮点数转换成人民币读法

    在Java中,浮点数有两种类型:float和double。float是单精度浮点数,占用4个字节,精度约为7位小数;double是双精度浮点数,占用8个字节,精度约为15位小数。由于浮点数在计算机内部是以二进制形式存储的,因此可能...

Global site tag (gtag.js) - Google Analytics