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

用零截断并舍入 BigInt

用零截断并舍入 BigInt

catspeake 2023-06-15 10:25:44
我有一个 BigInt 123456789n。我想用两个零将其截断为 123456700n。但我认为这还不够好——我希望最后一个剩余数字被最后一个截断的数字四舍五入。所以结果应该是123456800n。例子:1100n should be 1100n1149n should be 1100n1150n should be 1200n1199n should be 1200n具有可配置数量的零的解决方案将是惊人的。
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

也许这样的事情会奏效?


const f = (x,y) => ((x / y) * y) + (x%y >= 5n*(y/10n) ? y : 0n);

const y = 100n; // amount of padding, 100 = 2 last digits will become 0, 1000 = 3 last, etc. 

console.log(f(1100n, y)); // 1100n

console.log(f(1149n, y)); // 1100n

console.log(f(1150n, y)); // 1200n

console.log(f(1199n, y)); // 1200n

console.log(f(1200n, y)); // 1200n

console.log(f(11499n, 1000n)); // 11000n

console.log(f(11500n, 1000n)); // 12000n

console.log(f(123456789n, y)); // 123456800n

<!-- See browser console for output -->

将从数字(x / y) * y中删除最后两位数字。例如:y = 100x

(x/y) = 1149n / 100n = 11n 
(x/y) * y = 11n * 100n = 1100n

现在只需决定是添加y到上述结果(即:向上舍入)还是保持原样(向下舍入)。可能有一种更数学的方法可以做到这一点,但一种方法可能是使用三元。

例如,对于1149,我们要变为 0 的最后一位是49,可以检查它是否大于或等于 50,如果是,则添加y。如果小于 50,则加 0。


查看完整回答
反对 回复 2023-06-15
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我有一个涉及太多字符串的解决方案。不那么丑陋的东西会受到欢迎。


function truncateAndRound(input) {

  let str = input.toString();

  if (str.length < 2) {

    str = str.padStart(2, '0');

  }


  let num = BigInt(str) / 100n;

  const fraction = BigInt(str.slice(str.length - 2, str.length));


  if (fraction >= 50n) {

    num += 1n;

  }

  str = num.toString();


  return str + '00';

}


console.log(truncateAndRound(1100n));

console.log(truncateAndRound(1149n));

console.log(truncateAndRound(1150n));

console.log(truncateAndRound(1199n));


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

添加回答

举报

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