DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
如果使用这样可不可以保证在数据进行格式化的时候能够四舍五入,会不会有什么意外情况出现?

解决方案 »

  1.   

    package test;import java.math.RoundingMode;
    import java.text.DecimalFormat;public class Sample {
    public static void main(String[] args) {
    DecimalFormat df = new DecimalFormat("0.00");
    df.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(df.getRoundingMode());
    }
    }
    没错,想好点 你捕获一下异常  安全点
      

  2.   

    DecimalFormat 类 ----------四舍五入及格式化数字2010年05月25日 星期二 23:13DecimalFormat的用法介绍import java.text.*;
    import java.util.*;public class DecimalFormatSample {
    public static void main(String args[]) {
       DecimalFormat myformat1 = new DecimalFormat("###,###.0000");//使用系统默认的格式
       System.out.println(myformat1.format(111111123456.12));   Locale.setDefault(Locale.US);
       DecimalFormat myformat2 = new DecimalFormat("###,###.0000");//使用美国的格式
       System.out.println(myformat2.format(111111123456.12));   //----------------------------also use applypattern------------------------------//   DecimalFormat myformat3 = new DecimalFormat();
       myformat3.applyPattern("##,###.000");
       System.out.println(myformat3.format(11112345.12345));
    //-----------------控制指数输出-------------------------------------------------//      DecimalFormat myformat4 = new DecimalFormat();
       myformat4.applyPattern("0.000E0000");
       System.out.println(myformat4.format(10000));
       System.out.println(myformat4.format(12345678.345));
    //------------------百分数的输出-------------------------------------------//
    /*      DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此,你可以使用NumberFormat.getInstance 指定一个地区,
    然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用,但是你需要用try/catch 块包围强制转换以防转
    换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。     */
            DecimalFormat myformat5 = null;
       try{
           myformat5 = (DecimalFormat)NumberFormat.getPercentInstance();
       }catch(ClassCastException e)
       {
        System.err.println(e); 
       }
       myformat5.applyPattern("00.0000%");
       System.out.println(myformat5.format(0.34567));
       System.out.println(myformat5.format(1.34567));       }/*---------------------------------运行结果-------------------------------------------//
    F:\2004-04-12>java DecimalFormatSample
    111,111,123,456.1200
    111,111,123,456.1200
    11,112,345.123
    1.000E0004
    1.235E0007
    34.5670%
    134.5670%*/}==============================================================================
    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。要获取具体语言环境的 NumberFormat(包括默认语言环境),可调用 NumberFormat 的某个工厂方法,如 getInstance()。通常不直接调用 DecimalFormat 的构造方法,因为 NumberFormat 的工厂方法可能返回不同于 DecimalFormat 的子类。如果需要自定义格式对象,可执行:NumberFormat f = NumberFormat.getInstance(loc);
     if (f instanceof DecimalFormat) {
         ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
     }
    DecimalFormat 包含一个模式 和一组符号。可直接使用 applyPattern() 或间接使用 API 方法来设置模式。符号存储在 DecimalFormatSymbols 对象中。使用 NumberFormat 工厂方法时,可从已本地化的 ResourceBundle 中读取模式和符号。模式
    DecimalFormat 模式具有下列语法:模式:
    正数模式
    正数模式;负数模式
    正数模式:
    前缀opt 数字后缀opt
    负数模式:
    前缀opt 数字后缀opt
    前缀:
    除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符
    后缀:
    除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符
    数字:
    整数指数opt
    整数。小数指数opt
    整数:
    最小整数
             #
    # 整数
    # , 整数
    最小整数:
             0
    0 最小整数
    0 , 最小整数
    小数:
    最小小数opt 可选小数opt
    最小小数:
    0 最小小数opt
    可选小数:
    # 可选小数opt
    指数:
    E 最小指数
    最小指数:
    0 最小指数opt
    DecimalFormat 模式包含正数和负数子模式,例如 "#,##0.00;(#,##0.00)"。每个子模式都有前缀、数字部分和后缀。负数子模式是可选的;如果存在,则将用已本地化的减号(在多数语言环境中是 '-')作为前缀的正数子模式用作负数子模式。也就是说,单独的 "0.00" 等效于 "0.00;-0.00"。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;数字位数、最小位数,其他特征都与正数模式相同。这意味着 "#,##0.0#;(#)" 的行为与 "#,##0.0#;(#,##0.0#)" 完全相同。用于无穷大值、数字、千位分隔符、小数分隔符等的前缀、后缀和各种符号可设置为任意值,并且能在格式化期间正确显示。但是,必须注意不要让符号和字符串发生冲突,否则分析是不可靠的。例如,为了让 DecimalFormat.parse() 能够区分正数和负数,正数和负数前缀或后缀必须是不同的。(如果它们相同,则 DecimalFormat 的行为就如同未指定负数子模式一样。)另一个示例是小数分隔符和千位分隔符应该是不同的字符,否则将不可能进行分析。分组分隔符通常用于千位,但是在某些国家中它用于分隔万位。分组大小是分组字符之间的固定数字位数,例如 100,000,000 是 3,而 1,0000,0000 则是 4。如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以 "#,##,###,####" == "######,####" == "##,####,####"。特殊模式字符
    模式中的很多字符都是按字面解释的;在分析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。下列字符用在非本地化的模式中。已本地化的模式使用从此 formatter 的 DecimalFormatSymbols 对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。符号 位置 本地化? 含义 
    0 数字 是 阿拉伯数字 
    # 数字字 是 阿拉伯数字,如果不存在则显示为 0 
    . 数字 是 小数分隔符或货币小数分隔符 
    - 数字 是 减号 
    , 数字 是 分组分隔符 
    E 数字 是 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 
    ; 子模式边界 是 分隔正数和负数子模式 
    % 前缀或后缀 是 乘以 100 并显示为百分数 
    \u2030 前缀或后缀 是 乘以 1000 并显示为千分数 
    ¤ (\u00A4) 前缀或后缀 否 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 
    ' 前缀或后缀 否 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"。 科学计数法
    科学计数法中的数表示为一个尾数和一个 10 的几次幂的乘积,例如可将 1234 表示为 1.234 x 10^3。尾数的范围通常是 1.0 <= x < 10.0,但并非必需如此。可指示 DecimalFormat 仅通过某个模式 来格式化和分析科学计数法表示的数;目前没有创建科学计数法格式的工厂方法。在这个模式中,指数字符后面紧跟着一个或多个数字字符即指示科学计数法。示例:"0.###E0" 将数字 1234 格式化为 "1.234E3"。指数字符后面的数字位数字符数给出了最小的指数位数。没有最大值。使用本地化的减号来格式化负数指数,不 使用模式中的前缀和后缀。这就允许存在诸如 "0.###E0 m/s" 等此类的模式。 
    最小和最大整数数字位数一起进行解释: 
    如果最大整数数字位数大于其最小整数数字位数并且大于 1,则强制要求指数为最大整数数字位数的倍数,并将最小整数数字位数解释为 1。最常见的用法是生成工程计数法,其中指数是 3 的倍数,如 "##0.#####E0"。使用此模式时,数 12345 格式化为 "12.345E3",123456 则格式化为 "123.456E3"。 
    否则通过调整指数来得到最小整数数字位数。示例:使用 "00.###E0" 格式化 0.00123 时得到 "12.3E-4"。 
    尾数中的有效位数是最小整数 和最大小数 位数的和,不受最大整数位数的影响。例如,使用 "##0.##E0" 格式化 12345 得到 "12.3E3"。要显示所有位数,请将有效位数计数设置为零。有效位数不会影响分析。 
    指数模式可能不包含分组分隔符。 
    舍入
    DecimalFormat 使用 half-even 舍入(请参阅 ROUND_HALF_EVEN)进行格式化。阿拉伯数字
    为了进行格式化,DecimalFormat 使用 DecimalFormatSymbols 对象中所定义的、从已本地化的阿拉伯数字 0 开始的 10 个连续字符作为阿拉伯数字。为了进行分析,可识别 Character.digit 所定义的这些阿拉伯数字和所有 Unicode 十进制阿拉伯数字。特殊值
    NaN 被格式化为单个字符,通常是 \uFFFD。此字符由 DecimalFormatSymbols 对象所确定。这是惟一不使用前缀和后缀的值。无穷大的值被格式化为单个字符,通常是 \u221E,具有正数或负数前缀和后缀。无穷大值的字符由 DecimalFormatSymbols 对象所确定。将负零("-0")分析为如果 isParseBigDecimal() 为 true,则为 BigDecimal(0), 
    如果 isParseBigDecimal() 为 false 并且 isParseIntegerOnly() 为 true,则为 Long(0), 
    如果 isParseBigDecimal() 和 isParseIntegerOnly() 均为 false,则为 Double(-0.0)。 
    同步
    DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。示例
    // Print out a number using the localized number, integer, currency,
     // and percent format for each locale
     Locale[] locales = NumberFormat.getAvailableLocales();
     double myNumber = -1234.56;
     NumberFormat form;
     for (int j=0; j<4; ++j) {
         System.out.println("FORMAT");
         for (int i = 0; i < locales.length; ++i) {
             if (locales[i].getCountry().length() == 0) {
                continue; // Skip language-only locales
             }
             System.out.print(locales[i].getDisplayName());
             switch (j) {
             case 0:
                 form = NumberFormat.getInstance(locales[i]); break;
             case 1:
                 form = NumberFormat.getIntegerInstance(locales[i]); break;
             case 2:
                 form = NumberFormat.getCurrencyInstance(locales[i]); break;
    default:
                 form = NumberFormat.getPercentInstance(locales[i]); break;
             }
             if (form instanceof DecimalFormat) {
                 System.out.print(": " + ((DecimalFormat) form).toPattern());
             }
             System.out.print(" -> " + form.format(myNumber));
             try {
                 System.out.println(" -> " + form.parse(form.format(myNumber)));
    } catch (ParseException e) {}
         }
     }
     
     
      

  3.   

    本来就是四舍五入。唯一的问题是float/double本来就不精确
        float x = 0.000005f;
        x += 1000000;
        System.out.println(x);
      

  4.   

    同意楼上的,是四舍五入,是float/double本来就不精确
      

  5.   

    比如,0.1,0.01...float,double都不是0.1
      

  6.   

    是可以四舍五入,但这样的四舍五入稳不稳定,比如:
    df.format(0.045,2);
    它的结果会不会有时是0.05,有时又是0.04?
      

  7.   

    lz误解了。不会存在“df.format(0.045,2);
    它的结果会不会有时是0.05,有时又是0.04?”float和int一样都是32bit,也就是说,它们都只能表示2^32个精确值,int只有整数,范围-2^31 ~ 2^31 - 1。
    而float的最大值,最小值(Float.MAX_VALUE/MIN_VALUE)比int的范围更大,但是在这个范围内的浮点值的个数却是无穷个,所以,在这个范围内只有2^32是精确值,其余计算结果都只能用相邻的精确值来表示。整个精确值的分布,基本上可以看作是以0为中心的一个正态分布。以我上面的计算为例,
        float x = 0.000005f;
        float y = 1000000f;
        float z = x + y;
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
    x=0.000005,y=1000000都是精确值。而x+y却不是精确值,因此只能使用最接近的一个精确值来保存,也就是1000000f