2023年真的好难,4月底被上一家公司裁员到现在还在四处求职中。7月17号,去浦东一家叫奇普乐的芯片公司面试时,面试官问了一个关于字节转换的实操面试题目。当时一看这个,我去,这不以前还在代码中写过,实现也很简单,就是不断的去除 1024,但是这里作为面试题目肯定是留有后续问题等着你的,就是数字我不设上限,你如果按以前的方式,比如下面这种实现:
function getfilesize(size) {//把字节转换成正常文件大小
if (!size) return "";
var num = 1024.00; //byte
if (size < num)
return size + "B";
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "KB"; //kb
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "MB"; //M
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
注:来源自文章 js实现把字节转换成正常单位(kb,mb)
我当时也是这样子去想的,但是没有达到面试官的要求,于是就问了一下实现方式,他说倒着来遍历到小于 1024 就可以,于是面试结束后,回到家里在没有查询别人实现的情况下自己写了一下,然后简单测试了几个典型的值后,就在网上搜索了一个在线转换网站:whatsabyte.com/P1/byteconv… 对比了一下结果,没有什么问题后,又去网上看了一下别人的实现方式(问了 ChatGPT 居然给了我一个运行错误的实现),发现我这个实现各方面还是不错的,于是分享出来。
实现方式:
function formatNum(num, decimal = 2, returnAllUnit = false) {
// const units = ['', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB', 'NB', 'DB']
const units = ['', 'KB', 'MB', 'GB', 'TB'] // 限制到 TB
let pos = 0
let result = []
if (returnAllUnit) {
while (Math.ceil(num / 1024) >= 0 && pos < units.length - 1) {
num = num / 1024
pos++
result.push(num % 1024 ?
`${parseFloat(num.toFixed(decimal))}${units[pos]}` :
`${parseFloat((num / 1024).toFixed(decimal))}${units[pos + 1]}`
)
}
return result
} else {
while (Math.ceil(num / 1024) >= 2) {
num = num / 1024
pos++
}
return num % 1024 ?
`${parseFloat(num.toFixed(decimal))}${units[pos]}` :
`${parseFloat((num / 1024).toFixed(decimal))}${units[pos + 1]}`
}
}
var num = 12345353523
console.log(formatNum(num))
console.log(formatNum(num, 5, true))
代码运行结果:
11.5GB
[ '12056009.2998KB', '11773.44658MB', '11.49751GB', '0.01123TB' ]
最后,感谢奇普乐的技术负责人邵钏,第一次和技术圈内的大佬交流,受益颇多,同时也很遗憾自己这次来面试毫无准备,因为这家公司比较吃数据结果与算法,涉及3D开发,所以我还未来面试就放弃挣扎(为什么会是我,看中我什么了),但是当去面试后感受让我大为吃惊,只怪自己积累不够,简单的问题都满脑子空白,这边不在乎你有没有3D方面的背景知识,只需要你基础扎实,肯学就可以,所以还在找工作,有这个能力的同行可以一试。