截断的数字格式

时间:2017-01-10 22:20:14

标签: coldfusion

我需要格式化一些数字而不对它们进行舍入,如果它们是整数,则还要添加两个0,如下所示。

给出:10.20,结果:10.20 给出:10.56556,结果:10.56 给定:65000,结果:65000.00

这是我到目前为止所做的:

<cfscript>
vars = {};
vars.rate = 10.20;     // should yield to : 10.20
//vars.base_salary = 10.56556; // should yield to : 10.56
//vars.base_salary = 65000;    // should yield to : 65000.00



vars.formatted1 = trim(numberFormat((vars.rate * 100) / 100, "__________.__"));
vars.formatted2 = trim(numberFormat(int(vars.rate * 100) / 100, "__________.__"));

vars.formatted3 = NumberFormat((ceiling(vars.rate*100)/100), '9.99');

writeDump(vars);
</cfscript>

注意,10.20格式化为2,产生10.19,这是不正确的。 有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

由于您似乎代表货币,因此请勿使用floating point numbers。 CF通常使用Double来表示数字(以及使用NumberFormat格式化时),这是一种近似类型。当精度很重要时,不要使用近似类型,例如货币。而是使用BigDecimalPrecisionEvaluate()等功能。

如果没有更多细节,我会问为什么截断这些数字?虽然可能,但货币有点不典型。至少对于通常使用HALF_EVEN舍入的美国货币:

  

..向[最近邻居]舍入[s],除非两者兼而有之   邻居是等距的,在这种情况下,是向着均匀的   邻居......

那就是说,要回答这个问题,你可以通过创建一个BigDecimal来截断数字。然后使用setScale()指定所需的小数位数并覆盖默认的舍入模式。

注意:请务必阅读RoundingMode上的文档,以便您完全了解它如何处理各种值

示例:

doubleValue = 10.56556;
mode = createObject("java", "java.math.RoundingMode");
decimalValue = javacast("bigdecimal", doubleValue).setScale(2, mode.DOWN);
writeOutput("decimalValue = "& decimalValue);

<强>结果:

decimalValue = 10.20
decimalValue = 10.56
decimalValue = 6500.00