红宝石中的字节数到兆字节

时间:2015-06-11 05:33:32

标签: ruby-on-rails ruby

在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。

5 个答案:

答案 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_iround

  

但这种情况有所不同?例如,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