Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:将整数格式化为N位小数_Javascript_Math_Rounding_Decimal Point - Fatal编程技术网

Javascript:将整数格式化为N位小数

Javascript:将整数格式化为N位小数,javascript,math,rounding,decimal-point,Javascript,Math,Rounding,Decimal Point,在JavaScript中,将数字四舍五入到小数点后N位的典型方法如下: var s = number.toString(); if (s.indexOf('.') == -1) s += '.'; while (s.length < s.indexOf('.') + 4) s += '0'; 函数轮号(num,dec){ 返回Math.round(num*Math.pow(10,12月))/Math.pow(10,12月); } 函数轮号(num,dec){ 返回Math.round

在JavaScript中,将数字四舍五入到小数点后N位的典型方法如下:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
函数轮号(num,dec){
返回Math.round(num*Math.pow(10,12月))/Math.pow(10,12月);
}
函数轮号(num,dec){
返回Math.round(num*Math.pow(10,12月))/Math.pow(10,12月);
}
日志(轮号(0.1+0.2,2));

日志(轮号(2.1234,2))这不是取整问题,而是显示问题。数字不包含有关有效数字的信息;值2与2.0000000000000相同。当您将舍入值转换为字符串时,您将使其显示一定数量的数字

您可以在数字后添加零,类似于:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
var s=number.toString();
如果(s.indexOf('.')=-1)s+='.';
而(s.length
(注意,这假设客户端的区域设置使用句点作为小数分隔符,代码需要更多的工作才能用于其他设置。)

希望工作代码(没有做太多测试):

函数toFixed(值、精度){ var精度=精度| | 0, 负=值<0, 功率=数学功率(10,精度), 数值=数学四舍五入(数值*幂), 整数=字符串((neg?Math.ceil:Math.floor)(值/幂)), 分数=字符串((负?-value:value)%power), padding=新数组(Math.max(precision-fraction.length,0)+1); 返回精度?整数+'。+填充+分数:整数; }
我找到了一种方法。这是Christoph的代码和修复程序:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}
函数toFixed(值、精度){ var精度=精度| | 0, 功率=数学功率(10,精度), absValue=Math.abs(数学四舍五入(值*幂)), 结果=(值<0?'-:'')+字符串(数学地板(absValue/power)); 如果(精度>0){ var分数=字符串(ABS值%功率), padding=新数组(Math.max(precision-fraction.length,0)+1); 结果+='。+填充+分数; } 返回结果; }

如果您对我为什么添加“+1”感到好奇,请阅读使用数组构造函数重复字符的详细信息。

我认为这里给出的所有方法都有一种更简单的方法,即JavaScript中已经实现的方法
Number.toFixed()

简单地写下:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

等等。

做事总有更好的方法

var number = 51.93999999999761;
我想得到四位数的精度:51.94

只要做:

number.toPrecision(4);

结果将是:51.94

如果您不真正关心舍入,只需添加一个toFixed(x),然后在必要时删除尾随的0e和圆点。这不是一个快速的解决方案

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}
函数格式(值,小数){
如果(值){
值=固定值(小数);
}否则{
value=“0”;
}
如果(value.indexOf(“.”<0){value+=”;}
var dotIdx=value.indexOf(“.”);
while(value.length-dotIdx类似PHP的舍入方法
下面的代码可用于将您自己版本的Math.round添加到您自己的命名空间中,该命名空间采用精度参数。与上述示例中的十进制舍入不同,它不执行字符串之间的转换,并且精度参数的工作方式与PHP和Excel相同,即正1将舍入到小数点后1位,-1将舍入到小数点后1位d到十

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

我认为下面的函数可以帮助您

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

用法:
roundOff(600.23458,2);
将返回
600.23
这适用于舍入到N位数(如果您只想截断到N位数,请删除Math.round调用并使用Math.trunc one):

过去我在创作时不得不在Java上使用这种逻辑,这是因为我发现在0上多次添加0.1会导致意外的长小数部分(这是由于浮点算术)

一个用户评论称这种技术为缩放

有人提到,有些案例没有按预期的那样得到解决,因此建议改为:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}

通常,您可以使用
toFixed()
(),但IE中存在缺陷:;您必须编写自己的版本…@hoju-可能更改接受的答案-David的答案对于IE8+是正确的,而接受的答案在所有浏览器上都有一些严重的错误。@robocat:您是认真的吗?您的代码有一个错误。我尝试过修复(2.01,4)结果是“2.100”。如果我能找到解决方法,我会把它作为这个问题的答案发布。@mikez302:填充计算被关闭了一次;现在应该可以工作了,但是如果它仍然坏了,请随时给我发错误……非常奇怪。当我在firefox 17中打开firebug控制台运行此功能时,它会冻结整个浏览器,就像js陷入了无休止的循环一样。即使我没有控制台。记录输出。如果我没有激活firebug,bug也不会发生。更新,我在chrome中运行了它,我得到:Uncaught RangeError:toFixed函数调用超过了最大调用堆栈大小。@Sublymerck:我不知道为什么会发生这种情况;暗中拍摄:尝试重命名函数…toFixed有问题。。对于ins小数点:1.024499998,如果你使用dec.toFixed(4)=>1.0244。它应该是1.0245。@deepeshk但是使用
toFixed()
在四舍五入后在末尾填充小数会有什么问题?@deepeshk在什么浏览器中?在Chrome 17和
1.024499998.toFixed(4)中试过了
正确地返回
1.0245
@MarkTomlin:然后似乎你有一个字符串而不是一个数字..toFixed()在现代浏览器中工作得非常出色(我测试了Chrome、Firefox、IE11、IE8)@Bat_程序员-请澄清您认为哪些浏览器存在该漏洞。以2或3的精度传入708.3333的值会导致我返回708.00的值。我需要这两个小数位,在Chrome和IE 9中。toFixed(2)满足我的需要。这不是
function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}