Javascript Ecmascript bigint,从圆到偶数

Javascript Ecmascript bigint,从圆到偶数,javascript,rounding,bigint,Javascript,Rounding,Bigint,我正在使用ESNext的bigint功能。进行除法时,bigint四舍五入为0。以以下为例: 编号: > 3000 / 1578 1.9011406844106464 使用bigint: 3000n / 1578n 1n 我不想舍入到0,而是想编写一个函数,它可以进行除法运算,但使用四舍五入(舍入到偶数) 范例 function divide(a, b) { return a/b; } 我只是有点困惑,我如何编写我的除法函数,并使用余数进行取整,使之相等。这就是我所尝试的: fu

我正在使用ESNext的
bigint
功能。进行除法时,
bigint
四舍五入为0。以以下为例:

编号:

> 3000 / 1578
1.9011406844106464
使用bigint:

3000n / 1578n
1n
我不想舍入到0,而是想编写一个函数,它可以进行除法运算,但使用四舍五入(舍入到偶数)

范例

function divide(a, b) {
  return a/b;
}
我只是有点困惑,我如何编写我的
除法
函数,并使用余数进行取整,使之相等。这就是我所尝试的:

function divide(a, b) {
  let result = a/b;
  // if modulo is over half the divisor
  if ((a % b) * 2n > b) {
     // Add 1 if result is odd
     if (result % 2n === 1n) result++;
  } else {
     // Remove 1 if result is even
     if (result % 2n !== 1n) result--;
  }
  return result;
}

这给了我一个正确的除法(3000n,1578n),但我注意到这会给我一个错误的除法(7n,2n),我希望将其四舍五入到
4n

,银行家的四舍五入只影响余数正好是除数一半的除法。所有其他情况均为正常四舍五入

我认为你的功能应该修改如下:

函数划分(a、b){
//使A和B为正
常数aAbs=a>0?a:-a;
常数bAbs=b>0?b:-b;
让结果=aAbs/bAbs;
常数rem=aAbs%bAbs;
//如果余数>半除数,则应该向上取整而不是向下取整,因此添加1
如果(rem*2n>bAbs){
结果++;
}否则如果(rem*2n==bAbs){
//如果结果为奇数,则添加1以获得偶数返回值
如果(结果%2n==1n)结果++;
}
如果(a>0!==b>0){
//要么a或b为负,因此结果必须为
//也没有。
返回结果;
}否则{
返回结果;
}
}
控制台日志(划分(3000n,1578n));
控制台日志(划分(7n,2n));

console.log(除法(-7n,2n))这是一个很好的解决方案。越来越近了,但还是没有达到负数。我正试着根据你的结果找出答案。我非常感谢迄今为止的帮助!也许你可以对绝对值进行除法,然后对最终结果应用否定(如果a和b都是负数,则不能抵消)。我刚刚用那个建议更新了你的答案。这通过了我所有的测试用例,谢谢!