ruby-on-rails Ruby中的字节到兆字节

6yoyoihd  于 2023-05-23  发布在  Ruby
关注(0)|答案(6)|浏览(176)

在javascript(或coffeescript)中,我有以下函数:

bytesToMegabytes = (bytes) ->
  return Math.round((b/1024/1024) * 100) / 100

我想在Ruby中重现它。我有:

def bytes_to_megabytes (bytes)
    (((bytes.to_i/1024/1024) * 100) / 100).round
end

但这轮不同?例如,1153597在ruby代码中变为1。

5cnsuln7

5cnsuln71#

我不想自作聪明,但似乎没有人注意到这里的计算混乱。1兆字节就是1000000字节(google it)。1024是关于10^2字节的过时混淆,即1024千字节。自1998年以来,这被称为kibibbyte(wiki),现在是标准。
这意味着您只需将您的字节除以1000000就完成了。我添加了一些四舍五入以获得额外的有用性:

def bytes_to_megabytes (bytes)
    (bytes.to_f / 1000000).round(2)
end
puts bytes_to_megabytes(1153597)  # outputs 1.15
envsm3lx

envsm3lx2#

尝试:

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在ruby代码中变为1。

to_i方法只取小数部分,它不会舍入数字,因此您必须转换为float然后舍入

> "148.68".to_i
 #=> 148 
 > "148.68".to_f.round
 #=> 149

正如 *Stefen的评论 *:在Rails中,你可以这样做:

> 1153597 / 1.0.megabyte
 #=> 1.1001558303833008 
 > (1153597 / 1.0.megabyte).round
 #=> 1

有关megabyte方法的更多详细信息Numeric#megabyte

xn1cxnb4

xn1cxnb43#

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
cigdeys3

cigdeys34#

Ruby on Rails:

def bytes_to_megabytes(bytes)
  (bytes.to_f/1.megabyte).round(2)
end
uujelgoq

uujelgoq5#

JavaScript函数的等价物是

def bytes_to_megabytes (bytes)
    (bytes.to_f / 1024 / 1024 * 100).round / 100.0
end

Ruby做整数除法,而JavaScript做浮点除法。因此,必须确保至少有一个操作数是浮点数。

qni6mghb

qni6mghb6#

在ruby中,如果你有MB/KB/Bytes,并且想要转换成一个基本单位,那么使用下面的函数:

def convert_size_to_bytes(size)
  size_value, size_unit = size.split(" ")
  bytes = size_value.to_i

  case size_unit
  when "KB"
    bytes *= 1024
  when "MB"
    bytes *= 1024 * 1024
  when "GB"
    bytes *= 1024 * 1024 * 1024
  end

  bytes
end

现在你可以传递convert_size_to_bytes("30 MB")convert_size_to_bytes("2000 KB")这将有助于你的计算

相关问题