Я пытаюсь преобразовать большое число в мегабайты. Я не хочу десятичных дробей
numeric function formatMB(required numeric num) output="false" {
return arguments.num \ 1024 \ 1024;
}
Потом выдает ошибку
Как мне обойти это?
Я пытаюсь преобразовать большое число в мегабайты. Я не хочу десятичных дробей
numeric function formatMB(required numeric num) output="false" {
return arguments.num \ 1024 \ 1024;
}
Потом выдает ошибку
Как мне обойти это?
Вы не можете изменить размер Long, который CF использует для целых чисел. Поэтому вместо этого вам потребуется 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));
Integer
. здесь. Емкость Long
намного больше. пример Trycf.com.
- person Leigh; 24.02.2016
размер Long, который CF использует для целых чисел
Небольшая поправка для тех, кто может не читать комментарии. CF в основном использует 32-битные целые числа со знаком, не Long (который имеет емкость гораздо больше). Итак, как указано в сообщении об ошибке, предельный размер здесь — это емкость Целое число:
2147483647
9223372036854775807
Стоит отметить, что хотя CF относительно не имеет типов, некоторые функции Math и Date также имеют такое же ограничение. Например, хотя DateAdd технически поддерживает миллисекунд, если вы попытаетесь использовать очень большое число:
// getTime() - returns number of milliseconds since January 1, 1970
currentDate = dateAdd("l", now().getTime(), createDate(1970,1,1));
... произойдет сбой с той же ошибкой, потому что параметр "число" должен быть целым числом. Поэтому обратите внимание, если в документации упоминается «целое число». Это не просто означает "число" или "числовое"...
/
(т.е. нецелочисленный делитель) и форматировать, чтобы отрезать десятичные дроби? Я полагаю, вы могли бы использовать PrecisionEvaluate() или математику BigInteger, но это кажется излишним. - person Leigh   schedule 24.02.2016