【问题标题】:How to round down decimal number in javascript如何在javascript中舍入十进制数
【发布时间】:2019-03-28 00:03:58
【问题描述】:

我有这个十进制数:1.12346

我现在只想保留 4 位小数,但我想向下舍入以返回:1.1234。现在它返回:1.1235,这是错误的。

有效。我想要最后 2 个数字:“46”向下舍入到“4”而不是“5”

这怎么可能?

    var nums = 1.12346;
    nums = MathRound(nums, 4);
    console.log(nums);

function MathRound(num, nrdecimals) {
    return num.toFixed(nrdecimals);
}

【问题讨论】:

  • 所以你不希望它变圆,你希望它被切断。您这样做的唯一原因是将其显示为字符串,否则从那时起您的所有数学运算都会出错,所以:这是成为字符串的想法吗?
  • 是的,我希望它向下舍入:1.1234,而不是像现在这样的 1.1235。我想将其保留为数字而不是字符串。 (你是对的,在某种程度上它会“切断” 4 之后的其他数字)
  • 为了防止XY problem,你在做什么让你觉得你需要截掉小数点后第四位的数字?
  • “舍入”一词在这里并不准确,因为您仍想保留小数部分。乘以 10000,调用 Math.floor(),然后除以 10000。请注意,您可能仍需要调用 .toFixed(),因为小数位和二进制浮点数并不总是一致的。

标签: javascript rounding floor


【解决方案1】:

如果你这样做是因为你需要打印/显示一个值,那么我们不需要停留在数字领域:把它变成一个字符串,然后把它切碎:

let nums = 1.12346;

// take advantage of the fact that
// bit operations cause 32 bit integer conversion
let intPart = (nums|0); 

// then get a number that is _always_ 0.something:
let fraction = nums - intPart ;

// and just cut that off at the known distance.
let chopped = `${fraction}`.substring(2,6);

// then put the integer part back in front.
let finalString = `${intpart}.${chopped}`;

当然,如果您不是这样做是为了演示,那么可能应该回答“您为什么认为您需要这样做”的问题(因为它会使涉及该数字的后续数学无效)首先,因为帮助你做错事实际上并没有帮助,而是让事情变得更糟。

【讨论】:

  • 实际上,我实际上需要将数字作为数字而不是字符串,但它必须采用 4 位小数的格式并向下舍入,以便被某个函数接受并且小于1.12346 所以 4 位小数,然后该标准将是 1.1234。但这似乎也可以像那样砍掉它。
  • 当然可以,但是不要这样做。做@caseyjhol 展示的内容。将您的数字乘以 10000,取底,然后再除以 10000。
  • 是的,我实际上尝试使用@Bibberty 解决方案,这似乎也有效?
  • 它们都有效,但“times, floor, div”让它更简单,并且让您可能仍然遇到的怪癖(感谢 IEEE 浮点舍入)更加明显。
【解决方案2】:

我认为这可以解决问题。 从本质上纠正了向上取整。

var nums = 1.12346;
    nums = MathRound(nums, 4);
    console.log(nums);

function MathRound(num, nrdecimals) {
    let n = num.toFixed(nrdecimals);
    return (n > num) ? n-(1/(Math.pow(10,nrdecimals))) : n;
}

【讨论】:

  • 是的,这似乎可以解决问题,并且将所有内容保持在这样的数字中很好。谢谢!
【解决方案3】:

这与How to round down number 2 decimal places? 是同一个问题。您只需对额外的小数位进行调整。

Math.floor(1.12346 * 10000) / 10000

console.log(Math.floor(1.12346 * 10000) / 10000);

如果你想把它作为一个可重用的函数,你可以这样做:

function MathRound (number, digits) {
  var adjust = Math.pow(10, digits); // or 10 ** digits if you don't need to target IE
  return Math.floor(number * adjust) / adjust;
}

console.log(MathRound(1.12346, 4));

【讨论】:

  • 现代 JS 中不需要 Math.pow,只需使用 10 ** digits
  • @Mike'Pomax'Kamermans 好电话,但这在 Internet Explorer 中不起作用。不过,我会添加评论。
  • 就像我说的:现代 JS。 Internet explorer 只有一个受支持的版本,即使它被制造它的公司认为是遗留版本,由同一家公司制造的现代浏览器在仍然由同一家公司支持的每个操作系统中替换它。所以:除非明确指定它需要在 IE 中工作,否则最好忽略 IE 甚至在 2019 年仍然存在。
  • 通常我会同意,但在这样的情况下,它只是稍微难以键入并且具有相似的性能,我倾向于使用适用于每个浏览器的代码(特别是因为,取决于从你看,IE 仍然是第二或第三最常用的桌面浏览器)。
  • 很公平。我更倾向于“通过只教授现代 JS 来积极帮助世界忘记 IE 的存在”,但这是一个合理的论点。
【解决方案4】:

var nums = 1.12346;
var dec = 10E3;
var intnums = Math.floor(nums * dec);
var trim = intnums / dec;
console.log(trim);

【讨论】:

    【解决方案5】:
    var num = 1.2323232;
    converted_num = num.toFixed(2);  //upto 2 precision points
    o/p : "1.23"
    
    To get the float num : 
    converted_num = parseFloat(num.toFixed(2));
    o/p : 1.23
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2011-06-22
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多