<cfset number1 = 20.5/80 * 100 />
<cfset number2 = 18.125 />
<cfset number3 = 6.875 />
<cfoutput>
DecimalFormat(#number1#): #DecimalFormat(number1)#<br />
DecimalFormat(#number2#): #DecimalFormat(number2)#<br />
DecimalFormat(#number3#): #DecimalFormat(number3)#
</cfoutput>
Run Code Online (Sandbox Code Playgroud)
输出:
DecimalFormat(25.625):25.62
DecimalFormat(18.125):18.13
DecimalFormat(6.875):6.88
产量不仅仅是产量:
DecimalFormat(25.625):25.63
DecimalFormat(18.125):18.13
DecimalFormat(6.875):6.88
看起来,作为数学计算结果的变量使得DecimalFormat()的行为有所不同.任何快速修复,无需深入研究java?
我使用DecimalFormat创建一个总长度为6个字符的格式化小数.起初我使用了格式字符串new DecimalFormat("000.00")但这给了我一个负数的错误.添加减号并使第一个空格更大,导致-005.25而不是-05.25所希望的.
我已经能够使用以下代码解决此问题
DecimalFormat fmt;
if(netAmt < 0){
fmt = new DecimalFormat("00.00");
}else{
fmt = new DecimalFormat("000.00");
}
System.out.println(fmt.format(netAmt));
Run Code Online (Sandbox Code Playgroud)
但是DecimalFormat具有将;负数格式设置为不同于正数的字符.我无法正常工作.据我所知,以下代码应该像上面这样工作.
DecimalFormat fmt = new DecimalFormat("000.00;00.00");
System.out.println(fmt.format(netAmt));
Run Code Online (Sandbox Code Playgroud)
结果是,之前的模式;用于负数和正数,导致-005.25错误保留.我究竟做错了什么?我误解了什么;是为了什么?
核心问题是我需要记录一系列双打,每个双打都有不同数量的有效数字.数字的变化有很大的数字.一些有0(例如5257),有些有2(例如1308.75),有些一直有7(例如124.1171875).基本上是小数点后0到7位有效数字之间的所有内容.
标准Double.toString()适用于所有内容,但有7位有效数字.这是一直到6位数字,有效数字都打印没有任何无关紧要的数字.但是对于那些有7位有效数字的人,toString()会将最后一位数字舍入.即
5257 -> "5257"
1308.75 -> "1308.75"
124.1171875 -> "124.117188"
Run Code Online (Sandbox Code Playgroud)
当然我尝试使用DecimalFormat("#.#######"),这解决了丢失有效数字的问题,但它为许多低精度双精度打印了无关紧要的数字.即
1308.75 -> "1308.7499998"
Run Code Online (Sandbox Code Playgroud)
这也是不可接受的,因为它浪费了大量的空间(通常每天记录> 2 GB的数据)和2)它使用日志弄乱了应用程序.
在识别有效数字时,与toString()相比,DecimalFormat似乎很糟糕,无论如何要修复它?我只想使用toString()样式处理有效数字,并将最大位数从6扩展到7.
有任何想法吗?谢谢
您好我想使用DecimalFormat来显示:
8392472 如
839 24 72
我试过了
DecimalFormat dc = new DecimalFormat("000 00 00");
return dc.format(number);
Run Code Online (Sandbox Code Playgroud)
我也尝试过 "### ## ##"
我试图保留两个小数位,即使那时数字为零,使用DecimalFormatter:
DecimalFormat df = new DecimalFormat("#.00");
m_interest = Double.valueOf(df.format(m_principal * m_interestRate));
m_newBalance = Double.valueOf(df.format(m_principal + m_interest - m_payment));
m_principal = Double.valueOf(df.format(m_newBalance));
Run Code Online (Sandbox Code Playgroud)
但是对于某些值,这会给出两个小数位,而对于其他值则不会.我怎样才能解决这个问题?
我在我的应用程序中使用波斯语(locale-"fa")和Pashto(locale-"ps")语言进行本地化.当我尝试使用Decimal Foramt在BigDecimal中转换double值时,它在4.0.3中给出NumberFormatException波斯语.
以下是获取两位小数的代码:
public static String roundTwoDecimals(double d) {
System.out.println("===================Amount in double "+d);
DecimalFormat twoDForm = new DecimalFormat("#############.##");
String format=twoDForm.format(d);
System.out.println("===================Amount after formatting "+format);
return new BigDecimal(twoDForm.format(d)).toPlainString();
}
Run Code Online (Sandbox Code Playgroud)
logcat的:
03-26 15:19:29.714: I/System.out(1475): ===================Amount in double 166308.37
03-26 15:19:29.723: I/System.out(1475): ===================Amount after formatting ?????????
Run Code Online (Sandbox Code Playgroud)
实际金额是166308.37,当我将语言改为波斯语("fa")并格式化时,它给出?????????了4.0.3中的金额.所以这个字符串无法转换为BigDecimal并给出NumberFormatException.
奇怪的是,除了4.0.3之外,它的工作原理非常好.
我正在尝试支持左语言的RTL,并且正在测试阿拉伯语(我对此一无所知)。
负号/正号应该位于数字的右侧还是左侧?我认为应该在左侧,但是当我使用Android的DecimalFormat将数字放入设备设置的语言环境中时,该符号会显示在右侧。
有没有人遇到过这种情况,知道如何解决?我能想到的最好是,如果它是负数,则用括号将其打印出来,这应该可以解决但不是理想的情况。
编辑
抱歉,代码总是有帮助的。如果我打印以下内容(经度为负):
DecimalFormat coord_df = new DecimalFormat("#.000000");
coord_df.format(loc.getLongitude())
Run Code Online (Sandbox Code Playgroud)
像这样印
##,######-
Run Code Online (Sandbox Code Playgroud)
#号是阿拉伯数字(如此处显示在东部阿拉伯行上的数字:http : //en.wikipedia.org/wiki/Eastern_Arabic_numerals)
我需要在数字的正确边上得到负数(我相信这是左边)
解
我最终只是在需要弄乱显示数字(如此处的答案)时检查设备是否为RTL:android确定设备是否为从右到左的语言/布局
如果设备是RTL,则我使用带有负号的负子模式作为后缀,如下所示:
"#.000000,#.000000-"
Run Code Online (Sandbox Code Playgroud) 我曾经习惯DecimalFormat df = new DecimalFormat("#,###.00");格式化BigDecimal.
现在,我想使用该格式化的值(比如它是'1 250,00')来创建new BigDecimal.我试过这个:
BigDecimal result = new BigDecimal(model.getValue().replace(",",".").replace(" ",""));
Run Code Online (Sandbox Code Playgroud)
但是space1 250和2之间的1到2不会被替换.我该如何解决?
例:
DecimalFormat df = new DecimalFormat("#,###.00");
BigDecimal example = new BigDecimal("1250");
String str = df.format(example);
System.out.println(str.replace(",",".").replace(" ",""));
Run Code Online (Sandbox Code Playgroud) 我正在分析DecimalFormat圆形一个BigDecimal数字和其他机器上的情况,它被截断.
我已经验证了两台机器上的所有配置(我假设它们都是相同的).我唯一知道的差异是JDK版本.
机器1在JDK1.6上运行.但是,我在机器1上尝试过与JDK1.7相同的操作,它与JDK1.6的工作方式相同.
机器2在JDK1.7上运行
以下是代码段:
DecimalFormat decimalFormat = new DecimalFormat("#,###.00");
BigDecimal anObject = new BigDecimal("3.8880");
String str = decimalFormat.format(((Number)anObject).doubleValue());
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
在机器1上结果是:3.39
在机器2上的结果是:3.38
所以我想使用Decimal Format类来舍入数字:
double value = 10.555;
DecimalFormat fmt = new DecimalFormat ("0.##");
System.out.println(fmt.format(value));
Run Code Online (Sandbox Code Playgroud)
这里,变量value将四舍五入到2位小数,因为有两个#s.但是,我想要舍入value到未知的小数位数,由一个单独的整数表示numPlaces.有没有办法通过使用十进制格式化器来实现这一目标?
例如,如果numPlaces = 3和value = 10.555,则value需要四舍五入到小数点后3位
decimalformat ×10
java ×7
bigdecimal ×3
android ×2
coldfusion ×1
double ×1
localization ×1
numbers ×1
precision ×1
string ×1
tostring ×1