【问题标题】:What is up with this in ColdFusion's DecimalFormat() function? How do I get the correct result?ColdFusion 的 DecimalFormat() 函数是怎么回事?我怎样才能得到正确的结果?
【发布时间】:2009-09-15 16:20:39
【问题描述】:
<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>

输出:

十进制格式(25.625):25.62

十进制格式(18.125):18.13

十进制格式(6.875):6.88

而不是输出:

十进制格式(25.625):25.63

十进制格式(18.125):18.13

十进制格式(6.875):6.88

似乎作为数学计算结果的变量使 DecimalFormat() 的行为有所不同。任何快速修复,无需深入研究 java?

【问题讨论】:

  • 另外,NumberFormat(number1,".__") 做同样的事情。

标签: coldfusion decimalformat


【解决方案1】:

我认为问题不是DecimalFormat(),而是典型的浮点舍入错误。

见:PrecisionEvaluate()

【讨论】:

  • 不应该是任何浮点错误,所有这些数字都可以精确地表示为以2为底的浮点数。 (0.625 = 5/8, 0.125 = 1/8, 0.875 = 7/8。因为 8 是 2 的幂,所以不会有舍入误差。)我假设在下面使用 doublefloat封面...
  • 也就是说,我想不出他看到结果的任何原因
  • number1 = PrecisionEvaluate(20.5/80 * 100) 将得到 25.62500000000000000000 -> 25.63
  • 在计算中使用 PrecisionEvaluate() 使 DecimalFormat() 函数的行为更加一致! :)
【解决方案2】:

DecimalFormat 是一个格式化函数。不是数学函数。它的工作不是为你四舍五入,不幸的是 CF 缺乏良好的小数数学函数,所以你必须自己编写。

这是有人在 CF livedocs 页面上为 round() 写的:

 <cffunction name="roundDecimal" returntype="numeric"> 
     <cfargument name="num" type="numeric" required="yes"> 
     <cfargument name="decimal" type="numeric" default="2" required="no"> 

     <cfreturn round(num*10^decimal)/10^decimal /> 
  </cffunction>

【讨论】:

  • 没错,它是一个格式化函数,我将它用于输出,但需要它在计算与否的值之间保持一致。但是,如果您需要以其他方式舍入数字,这是一个很好的解决方案......
【解决方案3】:

快速解决方法是将第 1 行更改为 number1 = NumberFormat(20.5/80 * 100,'9.999')

【讨论】:

    【解决方案4】:

    请参阅 CF 文档 NumberFormat 并在 round 上进行页面搜索以查看一些具体信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多