java格式化数字

转载 2012年03月30日 05:49:12

java保留两位小数问题:

方式一:

四舍五入  
double   f   =   111231.5585;  
BigDecimal   b   =   new   BigDecimal(f);  
double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue();  
保留两位小数
  
---------------------------------------------------------------  

方式二:

java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.00");  
df.format(你要格式化的数字);

例:new java.text.DecimalFormat("#.00").format(3.1415926)

#.00 表示两位小数 #.0000四位小数以此类推...

方式三:

double d = 3.1415926;

String result = String .format("%.2f");

%.2f %. 表示小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型

方式四:

NumberFormat ddf1=NumberFormat.getNumberInstance() ;

void setMaximumFractionDigits(int digits)
digits 显示的数字位数
为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的

import java.text.* ;
import java.math.* ;
class TT
{
public static void main(String args[])
{ double x=23.5455;
NumberFormat ddf1=NumberFormat.getNumberInstance() ;


ddf1.setMaximumFractionDigits(2);
String s= ddf1.format(x) ;
System.out.print(s);
}
}

---------------------------------------------------------------------------------------------------------

有一篇:

1)、浮点数精确计算

胜利油田三流合一项目中一直存在一个问题,就是每次报表统计的物资金额和实际的金额要差那么几分钱,和实际金额不一致,让客户觉得总是不那么舒服,原因是因为我们使用java的浮点类型double来定义物资金额,并且在报表统计中我们经常要进行一些运算,但Java中浮点数(doublefloat)的计算是非精确计算,请看下面一个例子:

    System.out.println(0.05 + 0.01);

    System.out.println(1.0 - 0.42);

    System.out.println(4.015 * 100);

    System.out.println(123.3 / 100);

你的期望输出是什么?可实际的输出确实这样的:

    0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

这个问题就非常严重了,如果你有123.3元要购买商品,而计算机却认为你只有123.29999999999999元,钱不够,计算机拒绝交易。

2)、四舍五入

是否可以四舍五入呢?当然可以,习惯上我们本能就会这样考虑,但四舍五入意味着误差,商业运算中可能意味着错误,同时Java中也没有提供保留指定位数的四舍五入方法,只提供了一个Math.round(double d)Math.round(float f)的方法,分别返回长整型和整型值。round方法不能设置保留几位小数,我们只能象这样(保留两位):

public double round(double value){

return Math.round( value * 100 ) / 100.0;

}

但非常不幸的是,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的

4.015 * 100 = 401.49999999999994

因此如果我们要做到精确的四舍五入,这种方法不能满足我们的要求。

还有一种方式是使用java.text.DecimalFormat,但也存在问题,format采用的舍入模式是ROUND_HALF_DOWN(舍入模式在下面有介绍),比如说4.025保留两位小数会是4.02,因为.025距离 nearest neighbor.02.03)长度是相等,向下舍入就是.02,如果是4.0251那么保留两位小数就是4.03

System.out.println(new java.text.DecimalFormat("0.00").format(4.025));

System.out.println(new java.text.DecimalFormat("0.00").format(4.0251));

输出是

4.02

4.03

3)、浮点数输出(科学记数法)

Java浮点型数值在大于9999999.0就自动转化为科学记数法来表示,我们看下面的例子:

    System.out.println(999999999.04);

    System.out.println(99999999.04);

    System.out.println(10000000.01);

    System.out.println(9999999.04);

输出的结果如下:

    9.9999999904E8

9.999999904E7

1.000000001E7

9999999.04

    但有时我们可能不需要科学记数法的表示方法,需要转换为字符串,还不能直接用toString()等方法转换,很烦琐。

BigDecimal介绍

BigDecimalJava提供的一个不变的、任意精度的有符号十进制数对象。它提供了四个构造器,有两个是用BigInteger构造,在这里我们不关心,我们重点看用doubleString构造的两个构造器(有关BigInteger详细介绍请查阅j2se API文档)。

BigDecimal(double val)

           Translates a double into a BigDecimal.

BigDecimal(String val)

           Translates the String representation of a BigDecimal into a BigDecimal.

BigDecimal(double)是把一个double类型十进制数构造为一个BigDecimal对象实例。

BigDecimal(String)是把一个以String表示的BigDecimal对象构造为BigDecimal对象实例。

习惯上,对于浮点数我们都会定义为doublefloat,但BigDecimal API文档中对于BigDecimal(double)有这么一段话:

Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .10000000000000000555111512312578 27021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances notwithstanding.

The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one

下面对这段话做简单解释:

注意:这个构造器的结果可能会有不可预知的结果。有人可能设想new BigDecimal(.1)等于.1是正确的,但它实际上是等于.1000000000000000055511151231257827021181583404541015625,这就是为什么.1不能用一个double精确表示的原因,因此,这个被放进构造器中的长值并不精确的等于.1,尽管外观看起来是相等的。

然而(String)构造器,则完全可预知的,new BigDecimal(“.1”)如同期望的那样精确的等于.1,因此,(String)构造器是被优先推荐使用的。

详解Java中格式化输出浮点数

在Java中,我们经常使用%f来格式化输出浮点数,最近发现一个有趣的事。%f可以指定输出字符的宽度和小数点后的位数 1、只指定了整个输出的宽度public static void main(St...

Java 数字格式化

一:NumberFormat java.text.NumberFormat 是所有数值格式的抽象基类。 该类提供了格式化和分析数值的接口。 NumberFormat 也提供了确定哪个语言环境具有数值...

Java NumberFormat数字、货币值和百分数等的格式化处理

Java数字、货币值和百分数等的格式化处理 博客分类: JAVA JAVA数字格式化DecimalFormat  如果我们用下列语句输出一个数 System.out.println(1234...

Java string.format 控制整数与浮点数总结

1. 对整数进行格式化:%[index]$[标识][最小宽度]转换方式 标识:   '-' 在最小宽度内左对齐,不可以与“用0填充”同时使用   '#' 只适用于8进制和16进制,8进制...

Java中格式化输出数据

有时候,我们需要数据按某种格式输出:比如下图所示的 行对齐或者列队齐,列与列之间的空格,以及float型的数据,这时候,我们用到的是Formatter的format方法 Form...

java格式化输出数字总结

在实际工作中,常常需要设定数字的输出格式,如以百分比的形式输出,或者设定小数位数等,现稍微总结如下。   主要使用的类:java.text.DecimalFormat   1。实例化对象,可以用如...
  • meifage
  • meifage
  • 2011年12月01日 23:02
  • 4256

JAVA字符串格式化-String.format()的使用

常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种...

java 数字格式化处理(小数点 百分号等)

java.text 包中的一些包可以处理这类问题 import java.text.NumberFormat; 1。Decimalformat df1 = new Decimalf...

[JAVA] 数字格式化显示方法

参考自:http://blog.csdn.net/wangchangshuai0010/article/details/8577982 1. 用DecimalFormat类格式化数字显示。  2....

Java常用类库——数字格式化(NumberFormat)与大数操作(BigIntger、BigDecimal类)

学习目标 可以使用NumberFormat类进行本地化数字显示。 可以使用DecimalFormat指定格式化模板。 可以使用BigInteger操作大整数。 可以使用BigDecimal指定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java格式化数字
举报原因:
原因补充:

(最多只允许输入30个字)