Javascript 如何将浮点数的舍入限制为仅其“;小数部分”;不影响其“;整个零件”;

Javascript 如何将浮点数的舍入限制为仅其“;小数部分”;不影响其“;整个零件”;,javascript,floating-point,numbers,rounding,precision,Javascript,Floating Point,Numbers,Rounding,Precision,我在stackoverflow上找不到任何提问或回答此问题的帖子 正常的舍入方法将“浮点数”作为一个整体进行舍入(,即其分数部分和整个部分都在舍入过程中进行处理和影响) 因此,通常情况下(四舍五入分数): 在上述情况下,小数部分将被四舍五入到所需的小数位数,但数字的整个部分将不被触及 需要尾随零,因此输出格式将为字符串类型 该过程将舍入限制为浮点数的小数部分,并设置限制上限/限制,因为舍入不会进行到整个部分;i、 e.最大分数始终为0.999等 使用这种方法的情况是,在商店中,价格标签需要显示为

我在stackoverflow上找不到任何提问或回答此问题的帖子

正常的舍入方法将“浮点数”作为一个整体进行舍入(,即其分数部分和整个部分都在舍入过程中进行处理和影响)

因此,通常情况下(四舍五入分数):

在上述情况下,小数部分将被四舍五入到所需的小数位数,但数字的整个部分将不被触及

需要尾随零,因此输出格式将为字符串类型

该过程将舍入限制为浮点数的小数部分,并设置限制上限/限制,因为舍入不会进行到整个部分;i、 e.最大分数始终为0.999等

使用这种方法的情况是,在商店中,价格标签需要显示为USD NN.mm,但无论会计系统作为计算的一部分做什么,它都不能创建一个整数。因此,如果原始购买价格为22.45美元,并且由于任何计算而四舍五入不得导致22美元变为23美元。所以,它可以是任何高达22.99。这是一个示例,其中分数为2位小数(即,以美分为单位),但如果分数不是2,则需要一个通用且灵活的解决方案,以便仅舍入分数部分而不触及整个部分


谢谢。

以获取使用时的整数

 Math.floor(12.9768)
它会给你期望的整数,按原样取分数,或者你可以随意取分数

Math.floor(12.9768) + ( 12.9768 - Math.floor(12.9768) )

请尝试以下功能。。。它基本上会在指定的小数点后削减所有内容

函数精度(n,计数){
var指示器=数学功率(10,计数)| 1;
返回((n*指标)| 0)/指标;
}
如果需要尾随零,只需使用string.padEnd(count,“0”)

更新:

var num=12.9768;
函数精度(n,计数){
var指示器=数学功率(10,计数)| 1;
var整体=n | 0;
var decimal=n-整数;
var四舍五入=数学四舍五入(十进制*指标)/指标;
返回四舍五入>=1?整:整+四舍五入;
}
console.log(精度(num,0));
console.log(精度(num,1))//打印12张,否则会是13张
console.log(精度(num,2));
console.log(精度(num,3));

控制台日志(精度(num,6))由于缺乏javascript经验,我将尝试一种伪代码/javascript解决方案:

function MA_Round(n, precision) {
  // break into whole and fractional parts
  var whole =  Math.trunc(n);
  var frac =  n - whole;

  // Round fraction
  var pow10 = Math.pow(10, precision);
  var rvalue = Math.round(frac*pow10)/pow10;

  // Form limit of highest fractional value and apply
  var limit = 1.0 - 1.0/pow10;
  if (Math.abs(rvalue) > limit) rvalue = limit;

  // Form result
  return whole + rvalue;
}

此流程图可以是一种解决方法:


谢谢汤姆。一个问题是它不能正确地循环。例如
精度(1.987,2))
给出
1.98
它应该是
1.99
。功能应该正常运行,但不触及整个部分。这似乎比我想象的要复杂。我想我只是误解了一些东西。您希望一个数字按约定进行四舍五入,但如果您对四舍五入的数字进行四舍五入,它的工作方式应该与原始数字一样?我的方法只是把每一个小数点在一个特定的位置后删去,这就是我所相信的你想要的。也许你需要把你原来的号码储存在某个地方来解决你的问题。我希望我是对的,否则我不确定问题到底是什么。它应该只对小数部分进行正常的四舍五入,但不能允许四舍五入而改变整数。i、 e.整个零件必须保持完整。小数部分必须按正常情况四舍五入到所需的小数位数。当数字为负数时,这是否有效?可能是
Math.trunc()
?是的。这给了我一个思考的想法。谢谢,伙计。由于输出将需要尾随的零(即,无论如何都需要字符串输出),因此可以从一开始就将整数作为字符串处理。@Mohsenalyafi最后一部分
total+rvalue
可能会导致四舍五入,因此最好分别返回这两个值;打印整个部分,然后是
rvalue
部分。@Mohsenalyafi为了避免将FP值转换为字符串时出现舍入问题,这本身会导致舍入,请确保打印到至少有17位,可能是18位有效数字的字符串。请确保尝试使用FP值略小于1.0的任何代码,如0.999999999999
Math.floor(12.9768) + ( 12.9768 - Math.floor(12.9768) )
function MA_Round(n, precision) {
  // break into whole and fractional parts
  var whole =  Math.trunc(n);
  var frac =  n - whole;

  // Round fraction
  var pow10 = Math.pow(10, precision);
  var rvalue = Math.round(frac*pow10)/pow10;

  // Form limit of highest fractional value and apply
  var limit = 1.0 - 1.0/pow10;
  if (Math.abs(rvalue) > limit) rvalue = limit;

  // Form result
  return whole + rvalue;
}