在javascript(或coffeescript)中,我有以下功能:
bytesToMegabytes = (bytes) ->
return Math.round((b/1024/1024) * 100) / 100
我试图在红宝石中重新创建它。我有:
def bytes_to_megabytes (bytes)
(((bytes.to_i/1024/1024) * 100) / 100).round
end
但这种情况有所不同?例如,1153597在ruby代码中变为1。
答案 0 :(得分:6)
尝试:
def bytes_to_megabytes (bytes)
bytes / (1024.0 * 1024.0)
end
bytes_to_megabytes(1153597)
#=> 1.1001558303833008
您可以将CONSTANT
变量设为
MEGABYTES = 1024.0 * 1024.0
def bytes_to_megabytes (bytes)
bytes / MEGABYTES
end
bytes_to_megabytes(1153597)
#=> 1.1001558303833008
现在让您清楚to_i
和round
,
但这种情况有所不同?例如,1153597变为1 红宝石代码。
to_i 方法仅采用小数部分,它不会将您必须转换为float
的数字进行综合,然后进行综合
> "148.68".to_i
#=> 148
> "148.68".to_f.round
#=> 149
作为Stefen's comment:在Rails中您可以这样做:
> 1153597 / 1.0.megabyte
#=> 1.1001558303833008
> (1153597 / 1.0.megabyte).round
#=> 1
有关megabyte
方法 Numeric#megabyte
答案 1 :(得分:4)
1153597/1024
=> 1126
1153597/1024/1024
=> 1
这是有道理的,因为使用整数除法可得到整数结果,1153597字节大致等于1MB。如果您首先将输入转换为浮点数,则可能是您所期望的:
1153597.0/1024/1024
=> 1.1001558303833008
因此,请将代码更改为使用to_f
而不是to_i
,然后删除round
def bytes_to_megabytes (bytes)
(((bytes.to_f/1024/1024) * 100) / 100)
end
答案 2 :(得分:4)
我不想成为一个聪明的屁股,但似乎没有人注意到这里的计算混乱。 1兆字节只是1000000字节(google it)。 1024是一个过时的混乱,大约10 ^ 2字节,1024 KB。自1998年以来,这已被称为kibibyte(wiki),现在已成为常态。
这意味着你应该将你的字节除以1000000就完成了。我添加了一些舍入以获得额外的用处:
def bytes_to_megabytes (bytes)
(bytes.to_f / 1000000).round(2)
end
puts bytes_to_megabytes(1153597) # outputs 1.15
答案 3 :(得分:1)
相当于你的JavaScript函数
def bytes_to_megabytes (bytes)
(bytes.to_f / 1024 / 1024 * 100).round / 100.0
end
Ruby执行整数除法,而JavaScript执行浮点除法。因此,您必须确保至少有一个操作数是浮点数。
答案 4 :(得分:1)
使用Ruby on Rails:
def bytes_to_megabytes(bytes)
(bytes.to_f/1.megabyte).round(2)
end