2016-02-24 17 views
6

Tôi đang cố gắng chuyển đổi một số lượng lớn đi vào MB. Tôi không muốn thập phânColdFusion quá lớn để là một số nguyên

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

Sau đó nó ném một lỗi

enter image description here

Làm thế nào để làm được việc này?

+8

Bất kỳ lý do nào bạn không thể chỉ sử dụng '/' (tức là số nguyên không phải là số nguyên) và định dạng để xóa các số thập phân? Tôi cho rằng bạn có thể sử dụng phép toán PrecisionEvaluate() hoặc BigInteger, nhưng điều đó có vẻ như quá mức cần thiết. – Leigh

+2

@Làm ơn OMG! Hơn 3 năm kinh nghiệm về CF và hôm nay tôi đã học về ước số nguyên và ước số nguyên không sau khi đọc nhận xét của bạn. Tôi tự hỏi làm thế nào tôi đã bỏ lỡ điều này. Cảm ơn Leigh. –

+0

@TusharBhaware, trải nghiệm của tôi gấp 5 lần của bạn và tôi vẫn học được những điều từ việc đọc câu trả lời của người khác trên các diễn đàn này. –

Trả lời

7

Bạn không thể thay đổi kích thước của Long, đó là những gì CF sử dụng cho số nguyên. Vì vậy, bạn sẽ cần phải thay 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)); 

Nhưng khi Leigh chỉ ra ... cho những gì bạn đang làm, bạn có lẽ tốt hơn hết chỉ cần làm điều này:

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

* kích thước của hiệu chỉnh Long * Nhỏ. Dung lượng của ['Integer'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html) là yếu tố hạn chế ở đây. Dung lượng của một 'Long' lớn hơn nhiều. [Ví dụ về Trycf.com] (http://trycf.com/gist/f19684aa2d1a740751b0/acf2016?theme=monokai). – Leigh

1

kích thước của một Long, đó là những gì CF sử dụng cho số nguyên

Sửa chữa nhỏ cho những người có thể không đọc nhận xét. CF chủ yếu sử dụng 32 bit signed Integers, khôngLong (có dung lượng lớn hơn nhiều). Vì vậy, khi được thông báo lỗi chỉ ra, giới hạn kích thước ở đây là năng lực của một Integer:

  • Integer.MAX_VALUE = 2147483647
  • Long.MAX_VALUE = 9223372036854775807

Nó được giá trị lưu ý rằng mặc dù CF tương đối không có kiểu chữ, một số hàm Toán và Ngày cũng có cùng giới hạn. Ví dụ, mặc dù về mặt kỹ thuật DateAdd hỗ trợ mili giây, nếu bạn cố gắng và sử dụng một số lượng rất lớn:

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

... nó sẽ thất bại với cùng lỗi chính xác bởi vì "số" tham số phải là số nguyên. Vì vậy, hãy lưu ý nếu tài liệu đề cập đến "Số nguyên" được mong đợi. Nó không chỉ có nghĩa là "số" hoặc "số" ...

Các vấn đề liên quan