8

大量の数値をメガバイトに変換しようとしています。小数はいらない

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

その後、エラーがスローされます

ここに画像の説明を入力

どうすればこれを回避できますか?

4

2 に答える 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));

しかし、リーが指摘しているように...あなたがしていることについては、おそらくこれを行う方が良いでしょう:

return floor(arguments.num / (1024 * 1024));
于 2016-02-24T07:56:19.713 に答える
3

CFが整数に使用するLongのサイズ

コメントを読んでいないかもしれない人のための小さな修正。CF は主に32 ビットの符号付き Integersを使用しますが、Long (容量がはるかに大きい) は使用しません。 エラーメッセージが示すように、ここでのサイズ制限は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」パラメーターは整数でなければならないため、まったく同じエラーで失敗します。そのため、ドキュメントに「整数」が期待されると記載されている場合は注意してください。「数字」や「数値」だけを意味するものではありません...

于 2016-02-28T03:58:09.193 に答える