首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.format()错误?

String.format()错误?
EN

Stack Overflow用户
提问于 2010-11-30 23:22:45
回答 2查看 1.5K关注 0票数 2

下面给出了de_DE语言环境下J2SE和安卓系统的不同结果:

代码语言:javascript
复制
Locale locale = new Locale("de","DE");
log(String.format(locale,"%.1f", 0.45));

在JRE 1.6.0_22中,我得到了预期的"0,5“。

使用Android平台2.2,我得到的是"0,4“

谢谢,罗兰

EN

回答 2

Stack Overflow用户

发布于 2010-11-30 23:49:08

我不会称它为bug,除非您告诉我String.format方法应该使用哪种舍入模式的规范。1.6JRE似乎使用UP或HALF_UP作为RoundingMode。然而,在安卓系统中,使用的是HALF_EVEN模式,这似乎也是DecimalFormat的默认模式。这是我在JRE中用来测试以上内容的代码:

代码语言:javascript
复制
import java.util.Locale;
import java.text.DecimalFormat;
import java.math.RoundingMode;

public class Test {

    public static void main(String [] args) {
        Locale locale = new Locale("de","DE");
        String str = String.format(locale,"%.1f", 0.45);
        System.out.println(str);
        System.out.println(String.format("%.1f", 0.45));

        DecimalFormat df = new DecimalFormat("#.#");
        System.out.println(df.format(0.45));
        System.out.println(df.getRoundingMode());
        df.setRoundingMode(RoundingMode.HALF_UP);
        System.out.println(df.format(0.45));
    }
}

区域设置似乎与舍入模式无关。不幸的是,在Android中,DecimalFormat似乎不支持舍入模式,所以你不能直接运行相同的代码。

我也有兴趣在JRE1.5中运行相同的代码(它不支持舍入模式的设置),但我的机器中没有合适的环境。

票数 3
EN

Stack Overflow用户

发布于 2010-12-01 08:14:40

找到了Android的解决方案:

代码语言:javascript
复制
// format 
DecimalFormat df = new DecimalFormat("0.0");
BigDecimal valDec = new BigDecimal(String.valueOf(val));
BigDecimal roundedDec = valDec.setScale(1,BigDecimal.ROUND_HALF_UP);
return df.format(roundedDec.doubleValue());

使用double的字符串表示来实例化BigDecimal似乎很重要,因为如果不这样做,就会得到一些有趣的值。下面是一个例子:

代码语言:javascript
复制
BigDecimal test = new BigDecimal(0.85);
Log.v(TAG,"BigDecimal: "+test.toPlainString());

-> 0.84999999999999997779553950749686919152736663818359375 :BigDecimal

如果你现在使用上面的代码,你当然会得到0.8,而不是你所期望的0.9。

谢谢,罗兰

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4315304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档