Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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仅显示X位小数,不舍入_Javascript - Fatal编程技术网

JavaScript仅显示X位小数,不舍入

JavaScript仅显示X位小数,不舍入,javascript,Javascript,我知道以前有人问过这个问题,但有几个问题我正试图解决 function calc(number) { var num = number; var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]; return with2Decimals } 我发现另一个方法与我更喜欢的方法相同: function decimalFix(numToBeTruncated, numOfDecimals) {

我知道以前有人问过这个问题,但有几个问题我正试图解决

function calc(number) {
    var num = number;
    var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0];
    return with2Decimals
}
我发现另一个方法与我更喜欢的方法相同:

function decimalFix(numToBeTruncated, numOfDecimals) { 
    var theNumber = numToBeTruncated.toString(); 
    var pointIndex = theNumber.indexOf('.');
    return +(theNumber.slice(0, pointIndex > -1 ? ++numOfDecimals + pointIndex : undefined)); 
}
    

问题是: 在大多数情况下,除了非常大的十进制数外,它们工作得很好。例如,在javascript中,数字
0.0000000 19902020291
读作1.990202029E-8,因此如果我想要小数点后的9位,则不会给我
0.0000000 19
,而是给我1.99020202,这是非常离谱的

为什么? 很多人真的很沮丧,因为我/其他人甚至想解决这个问题,因为这对他们来说似乎是非正统的。它主要与货币有关,如果我只被允许在计算中如此精确的话,它不会损失价值的一小部分。例如,有时我需要计算小数点后6-8位的小额交易,但如果我选择四舍五入,我在计算过程中会损失或获得金钱

我感谢任何人在这个问题上能给予的帮助或指导

预期成果:
您说过小数点右边需要6-8位,左边需要6-8位(但通常更像1-3)

这正是JavaScript的数字类型(IEEE-754双精度二进制浮点)的优势(如果真的是8.8,则超过了优势)。不管小数点在哪里,JavaScript的浮点在丢失信息之前大约有15位小数精度。(无论如何,这还不是故事的全部。)

好消息:JavaScript获得了一个可以用于此操作的
BigInt
类型(通过将值乘以100000000,使其成为整数)、详细信息。在此之前,您可以考虑使用现有的“大数”库之一。 如果需要使用JavaScript的数字,我会使用整数。对于整数,您的精确范围是
-Number.MAX\u SAFE\u INTEGER-1
Number.MAX\u SAFE\u INTEGER+1
。这是-9007199254740992到9007199254740992。有了它,你可以得到小数点左边七位数和右边八位数(当然,也可以是左边八位数和右边七位数)。因此,如果我们使用小数点右边的八位数字和左边的七位数字(在限制范围内),那就是
-9999999.99999999
9999999.9999999

计算将用于删除分数部分(假设您希望向零截断)。没有科学符号的输出是微不足道的:

str = String(number);
str = str.substring(0, str.length - 8) + "." + str.substr(-8);
示例:

函数到字符串(数字){
var str=字符串(数字);
str=str.substring(0,str.length-8)+“+str.substr(-8);
返回str;
}
console.log(toString(999999999999));
日志(toString(123456712345678));

日志(toString(765432187654321))您说过小数点右边需要6-8位,左边需要6-8位(但通常更像1-3)

这正是JavaScript的数字类型(IEEE-754双精度二进制浮点)的优势(如果真的是8.8,则超过了优势)。不管小数点在哪里,JavaScript的浮点在丢失信息之前大约有15位小数精度。(无论如何,这还不是故事的全部。)

好消息:JavaScript获得了一个可以用于此操作的
BigInt
类型(通过将值乘以100000000,使其成为整数)、详细信息。在此之前,您可以考虑使用现有的“大数”库之一。 如果需要使用JavaScript的数字,我会使用整数。对于整数,您的精确范围是
-Number.MAX\u SAFE\u INTEGER-1
Number.MAX\u SAFE\u INTEGER+1
。这是-9007199254740992到9007199254740992。有了它,你可以得到小数点左边七位数和右边八位数(当然,也可以是左边八位数和右边七位数)。因此,如果我们使用小数点右边的八位数字和左边的七位数字(在限制范围内),那就是
-9999999.99999999
9999999.9999999

计算将用于删除分数部分(假设您希望向零截断)。没有科学符号的输出是微不足道的:

str = String(number);
str = str.substring(0, str.length - 8) + "." + str.substr(-8);
示例:

函数到字符串(数字){
var str=字符串(数字);
str=str.substring(0,str.length-8)+“+str.substr(-8);
返回str;
}
console.log(toString(999999999999));
日志(toString(123456712345678));
日志(toString(765432187654321))
它主要与货币有关,如果我只被允许在计算中如此精确的话,它不会损失价值的一小部分。例如,有时我需要计算小数点后6-8位的小额交易,但如果我选择四舍五入,我在计算过程中会损失或获得金钱

//四舍五入到任意精度
函数舍入(值,精度=1){
返回数学整数(值/精度)*精度
}
控制台日志(“圆形”);
控制台日志(圆形(1.23456789,0.001));
控制台日志(圆形(1.23456789,1/4));
log(round(Date.now(),1000*60*60))//当前时间戳四舍五入为小时
//四舍五入到一定的小数位数
函数roundToDecimalPlaces(值,decimalPlaces=0){
返回四舍五入(值,“1e”+(-decimalPlaces));
}
控制台日志(“roundToDecimalPlaces”);
控制台日志(roundToDecimalPlaces(1.23456789,4));
日志(roundToDecimalPlaces(0.00000001990202029,9));
//并且在一定的小数点后截断所有内容
函数decimalFix(值,decimalPlaces=0){
设精度=“1e”+(-小数位数);
返回数学[值<0?“ceil”:“floor”](值/精度)*精度;
}
控制台日志(“decimalFix”);
欺骗