1 回答
TA贡献1799条经验 获得超8个赞
你的base16ToBase10很好。你base10ToBase16错了。查看代码段输出。
function insertAt(str, toAdd, position) {
return `${str.slice(0, position)}${toAdd}${str.slice(position)}`
}
function isInteger(value) {
return Number(value) === value && value % 1 === 0
}
function decimalsLength(value) {
const [integerPart, decimalPart] = value.toString().split('.')
return decimalPart ? decimalPart.length : 0
}
function base10ToBase16(base10) {
const precision = decimalsLength(base10)
const multiplied = base10 * Math.pow(16, precision)
const hexadecimal = multiplied.toString(16)
if (isInteger(base10)) return hexadecimal
return insertAt(hexadecimal, '.', hexadecimal.length - precision)
}
function base16ToBase10(base16) {
const [integerPart, decimalPart] = base16.split('.')
if (!decimalPart) return parseInt(integerPart, 16)
return parseInt(integerPart, 16) + parseInt(decimalPart, 16) / Math.pow(16, decimalPart.length)
}
const numbers = [0, 0.5, 1, 0.8, 0.85, 0.855, 0.8555, 100, 255]
const wrong_hexes = numbers.map(base10ToBase16)
const hexes = numbers.map(n => n.toString(16))
console.log(wrong_hexes + "")
console.log(hexes + "")
console.log("hexes NOT eq wrong_hexes = ", hexes + "" !==
wrong_hexes + "")
const roundtrip_numbers = hexes.map(base16ToBase10)
console.log(numbers + "")
console.log(roundtrip_numbers + "")
console.log("roundtrip_numbers eq numbers = ", roundtrip_numbers + "" === numbers + "")
不太确定你想用你自己的功能实现什么base10ToBase16。你已经toString(16)在里面使用了。所以最简单的方法是使用numbers.map(n => n.toString(16))代替。
添加回答
举报