为了账号安全,请及时绑定邮箱和手机立即绑定

将数字(也包括浮点数)转换为十六进制,反之亦然

将数字(也包括浮点数)转换为十六进制,反之亦然

我正在尝试创建两个函数:第一个函数将数字(也是浮点数)转换为十六进制字符串,第二个函数将数字(也是浮点数)转换为十六进制字符串,反之亦然。这是我的代码: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并不相等。有没有办法做到这一点?我读了这个问题,并尝试遵循他们的建议。
查看完整描述

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))代替。


查看完整回答
反对 回复 2023-06-09
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信