下面给出了de_DE语言环境下J2SE和安卓系统的不同结果:
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“
谢谢,罗兰
发布于 2010-11-30 23:49:08
我不会称它为bug,除非您告诉我String.format方法应该使用哪种舍入模式的规范。1.6JRE似乎使用UP或HALF_UP作为RoundingMode。然而,在安卓系统中,使用的是HALF_EVEN模式,这似乎也是DecimalFormat的默认模式。这是我在JRE中用来测试以上内容的代码:
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中运行相同的代码(它不支持舍入模式的设置),但我的机器中没有合适的环境。
发布于 2010-12-01 08:14:40
找到了Android的解决方案:
// 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似乎很重要,因为如果不这样做,就会得到一些有趣的值。下面是一个例子:
BigDecimal test = new BigDecimal(0.85);
Log.v(TAG,"BigDecimal: "+test.toPlainString());-> 0.84999999999999997779553950749686919152736663818359375 :BigDecimal
如果你现在使用上面的代码,你当然会得到0.8,而不是你所期望的0.9。
谢谢,罗兰
https://stackoverflow.com/questions/4315304
复制相似问题