我在当前项目中将字节转换为千兆字节时遇到了一些麻烦。最初我这样做了:
long requiredDiskSpace = 5000000000000; // In bytes
int gb = (int)requiredDiskSpace / 1024 / 1024 / 1024;
此计算变为0.(正确应为4 656)。然后我切换到decimal
类型,如下所示:
long requiredDiskSpace = 5000000000000; // In bytes
decimal gb = requiredDiskSpace / 1024 / 1024 / 1024;
int gbAsInt = (int)gb;
此计算(正确)使gbAsInt
4 656。
现在,我的问题很简单;为什么?对我来说,计算看起来很相似,因为我对任何十进制数都不感兴趣,我不明白为什么我不能在实际计算中使用int。
答案 0 :(得分:9)
您正在尝试将5000000000000转换为整数。这将无法正常工作,因为该数字大于Int.MaxValue
所以你应该做的事情:
int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);
答案 1 :(得分:8)
问题是(int)requiredDiskSpace
,值5000000000000
对于整数来说太大了。
答案 2 :(得分:5)
你的问题是(int)
。您将long
投射到int
那样。但是5000000000000不能适合32位整数,所以你最终得到的数字完全不同于-2 31 和2 31 。除以1073741824然后得到0。
我怀疑你只是希望将结果投放到int
:
int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);
答案 3 :(得分:4)
原因是你的演员。如果使用括号,它将正常工作:
(int)(requiredDiskSpace / 1024 / 1024 / 1024)
您的代码中会发生以下情况:
答案 4 :(得分:3)
计算后投射:
long requiredDiskSpace = 5000000000000; // In bytes
int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);
当你立即施放到int时,你会失去价值。
答案 5 :(得分:2)
您正在将字节值转换为int
,而long test = 5000000000000;
int value = (int)test; // value = 658067456
无法容纳如此大的数字。
627 / 1024
将此值除以1024的三次将导致0
等于(整数运算){{1}}。
答案 6 :(得分:1)
因为当你使用整数除法时,每次都会将结果截断为整数 因此,您首次尝试为零,即使因为5000000000000太大而无法存储在int var中 你应该使用
double gb = 1.0d * requiredDiskSpace / (1024 * 1024 * 1024);