ColdFusion слишком велик, чтобы быть целым числом

Я пытаюсь преобразовать большое число в мегабайты. Я не хочу десятичных дробей

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

Потом выдает ошибку

введите описание изображения здесь

Как мне обойти это?


person James A Mohler    schedule 24.02.2016    source источник
comment
По какой-то причине вы не можете просто использовать / (т.е. нецелочисленный делитель) и форматировать, чтобы отрезать десятичные дроби? Я полагаю, вы могли бы использовать PrecisionEvaluate() или математику BigInteger, но это кажется излишним.   -  person Leigh    schedule 24.02.2016
comment
@Ли ОМГ! Более 3 лет опыта работы с CF, и сегодня я узнал о целочисленных делителях и нецелочисленных делителях, прочитав ваш комментарий. Интересно, как я пропустил это. Спасибо Ли.   -  person Tushar Bhaware    schedule 24.02.2016
comment
@TusharBhaware, мой опыт в 5 раз больше вашего, и я все еще узнаю много нового, читая ответы других людей на этих форумах.   -  person Dan Bracuk    schedule 24.02.2016
comment
@TusharBhaware - Хех, вот что делает его веселым :) Всегда можно узнать что-то новое.   -  person Leigh    schedule 24.02.2016
comment
@DanBracuk, Вау... это огромный опыт. Я надеюсь сохранить свою жажду узнать больше живым, как это сделали вы.   -  person Tushar Bhaware    schedule 25.02.2016
comment
@Ли, правда. Но я никогда не думал, что мне придется изучать операторы после 3 лет программирования. :)   -  person Tushar Bhaware    schedule 25.02.2016


Ответы (2)


Вы не можете изменить размер 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));
person Adam Cameron    schedule 24.02.2016
comment
размер Long Небольшая коррекция. Ограничивающим фактором является пропускная способность Integer. здесь. Емкость Long намного больше. пример Trycf.com. - person Leigh; 24.02.2016

размер Long, который CF использует для целых чисел

Небольшая поправка для тех, кто может не читать комментарии. CF в основном использует 32-битные целые числа со знаком, не Long (который имеет емкость гораздо больше). Итак, как указано в сообщении об ошибке, предельный размер здесь — это емкость Целое число:

  • Целое число.MAX_VALUE = 2147483647
  • Длинная.MAX_VALUE = 9223372036854775807

Стоит отметить, что хотя CF относительно не имеет типов, некоторые функции Math и Date также имеют такое же ограничение. Например, хотя DateAdd технически поддерживает миллисекунд, если вы попытаетесь использовать очень большое число:

//  getTime() - returns number of milliseconds since January 1, 1970 
currentDate = dateAdd("l", now().getTime(), createDate(1970,1,1));

... произойдет сбой с той же ошибкой, потому что параметр "число" должен быть целым числом. Поэтому обратите внимание, если в документации упоминается «целое число». Это не просто означает "число" или "числовое"...

person Leigh    schedule 28.02.2016