2016-02-24 4 views
6

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

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

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

enter image description here

Как обойти это?

+8

По какой-либо причине вы не можете просто использовать '/' (то есть не целочисленный делитель) и форматировать, чтобы уничтожить десятичные знаки? Я полагаю, вы могли бы использовать математику PrecisionEvaluate() или BigInteger, но это похоже на перебор. – Leigh

+2

@Leigh OMG! Более 3-х лет опыта CF, и сегодня я узнал о целочисленном делителе и не целочисленном делителе после прочтения вашего комментария. Интересно, как я это пропустил. Спасибо Ли. –

+0

@TusharBhaware, мой опыт в 5 раз больше, и я все еще участвую в чтении чужих ответов на этих форумах. –

ответ

7

Вы не можете изменить размер 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)); 

Но Leigh указывает ... за то, что вы делаете, вы, вероятно, лучше всего делать это:

return floor(arguments.num/(1024 * 1024)); 
+0

* Размер длинной * Небольшая коррекция. В качестве ограничивающего фактора здесь используется емкость ['Integer'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html). Емкость «Длинного» намного больше. [Пример Trycf.com] (http://trycf.com/gist/f19684aa2d1a740751b0/acf2016?theme=monokai). – Leigh

1

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

Небольшая коррекция для тех, кто не читает комментарии. В основном CF использует 32 bit signed Integers, не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)); 

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

Смежные вопросы