ColdFusion太大无法转换为整数。

9

我正在尝试将一个大数字转换为兆字节。我不想要小数。

numeric function formatMB(required numeric num) output="false" {
    return arguments.num \ 1024 \ 1024;
    } 

接着它会出现一个错误

在这里输入图片描述

我该怎么解决这个问题?


9
有没有什么原因不能使用“/”(即非整数除法),并使用格式化来截取小数点后的数字?我想你也可以使用PrecisionEvaluate()或BigInteger数学函数,但那看起来有些过度设计了。 - Leigh
3
@Leigh 哇塞!我有三年以上的CF经验,今天在读了你的评论后才学习到整数因子和非整数因子。我不知道我是怎么错过这个的。谢谢Leigh。 - Tushar Bhaware
1
@TusharBhaware,我的经验是你的5倍,但我仍然从阅读其他人在这些论坛上的答案中学到了很多东西。 - Dan Bracuk
2
@TusharBhaware - 嘿,这就是让它变得有趣的原因 :) 总是有新东西要学习。 - Leigh
@DanBracuk,哇...那是一次巨大的经历。我希望像你一样保持对更多知识的渴望。 - Tushar Bhaware
2
@Leigh,没错。但是我从来没有想过在编程三年后还需要学习运算符。 :) - Tushar Bhaware
2个回答

8

您无法更改CF用于整数的Long大小。因此,您需要改用BigInteger

numeric function formatMB(required numeric num) {
    var numberAsBigInteger = createObject("java", "java.math.BigInteger").init(javacast("string", num));
    var mbAsBytes = 1024 ^ 2;
    var mbAsBytesAsBigInteger = createObject("java", "java.math.BigInteger").init(javacast("string", mbAsBytes));
    var numberInMb = numberAsBigInteger.divide(mbAsBytesAsBigInteger);
    return numberInMb.longValue();
}

CLI.writeLn(formatMB(2147483648));

但正如Leigh所指出的那样,对于你所做的事情,最好只是这样做:
return floor(arguments.num / (1024 * 1024));

长整型的大小。小修正。这里的限制因素是Integer的容量。Long的容量要大得多。Trycf.com示例 - Leigh

3

使用CF作为整数时,它使用的是Long的大小。

对于那些可能不会阅读评论的人来说,有一个小修正。CF主要使用32位有符号整数,而不是Long(其容量更大)。因此,正如错误消息所示,这里的大小限制是Integer的容量:

  • Integer.MAX_VALUE = 2147483647
  • Long.MAX_VALUE = 9223372036854775807
值得注意的是,尽管 CF 相对无类型,一些数学和日期函数也存在相同的限制。例如,尽管DateAdd技术上支持毫秒,但如果您尝试使用非常大的数字:
//  getTime() - returns number of milliseconds since January 1, 1970 
currentDate = dateAdd("l", now().getTime(), createDate(1970,1,1));

如果“number”参数必须是整数,那么它将因为相同的错误而失败。因此请注意,如果文档中提到期望一个“整数”,那么它并不仅仅意味着一个“数字”或“数值”...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接