如何解决将数字也可以是浮点数转换为十六进制,反之亦然
我正在尝试创建两个函数:第一个将数字(也为浮点数)转换为十六进制字符串的函数,第二个则相反。
这是我的代码:
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)
}
/////////////////////////
// Test
/////////////////////////
const numbers = [0,0.5,1,0.8,0.85,0.855,0.8555,100,255]
const hexes = numbers.map(n => base10ToBase16(n))
console.log(hexes)
console.log(hexes.map(h => base16ToBase10(h)))
/////////////////////////
// Utility functions
/////////////////////////
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
}
如您所见,hexes
和numbers
不等于。
有没有办法做到这一点?
我读了this question,并尝试遵循他们的建议。
解决方法
您的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))
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。