如何使用Javascript使浮点数的精度相同

Posted

技术标签:

【中文标题】如何使用Javascript使浮点数的精度相同【英文标题】:How to make the precision of float numbers the same using Javascript 【发布时间】:2015-03-17 14:34:42 【问题描述】:

我在 javascript 中有两个浮点数,精度高低(事先不知道),例如:

1545.165 
12.15364613

如何将高精度数字四舍五入到与低精度数字相同的精度? 在我们的例子中,

12.154

【问题讨论】:

【参考方案1】:

您可以使用toFixed() 函数来解决问题。

语法: <number>.toFixed(precision)

例如:

12.15364613.toFixed(3)12.154

但要使其适用于您的情况,您需要执行以下操作:

警告未经测试的代码,我只是想让你大致了解如何做到这一点,当然下面的代码可以改进。

var num1 = 12.15364613;
var num1Str = (12.15364613).toString();
var num1Precision = parseInt(num1Str.substring(num1Str.indexOf('.')).length - 1);

var num2 = 12.154;
var num2Str = (12.154).toString();
var num2Precision = parseInt(num2Str.substring(num2Str.indexOf('.')).length - 1);

if(num1Precision > num2Precision)
    num1 = num1.toFixed(num2Precision);
 else
    num2 = num2.toFixed(num1Precision);

【讨论】:

你怎么知道精度等于3? @ФилиппЦветков 您选择您认为有用的精度。 @Kroltan 我认为 OP 意味着其他精确的东西,但我也不知道是什么。 精度事先不知道。我把精确的数字作为例子 更好。但是没有任何本机数字函数可以在不将其转换为字符串的情况下获得精度?【参考方案2】:

纯数学解

为了获得未知数(变量)的精度,您可以使用这样的函数:

function getPrecision(x) 
    // i < 10 - just to avoid infinite looping
    // (which may occur if x is a real number like PI)
    // x - Math.floor(x) + (x < 0? 1 : 0) is a fractional part of x
    for (var i = 0; i < 10 && x - Math.floor(x) + (x < 0? 1 : 0) > 0; i++, x *= 10) ;
    return i;

所以代码应该是这样的:

// array of given numbers:
aVals = [1545.165, 12.15364613];
// array of numbers' precisions:
var aPre = aVals.map(getPrecision);
// find the least precision:
var minPre = Math.min.apply(null, aPre);

// result array of fixed numbers with the same precision:
var aValsFixed = aVals.map(function(v)  return v.toFixed(minPre); );

【讨论】:

【参考方案3】:

你的意思是这样的?

var number = 1.2333445454;

var n = number.toFixed(3);

alert(n);

【讨论】:

为什么将精度固定为 3? 精度事先不知道。我把精确的数字作为例子

以上是关于如何使用Javascript使浮点数的精度相同的主要内容,如果未能解决你的问题,请参考以下文章

解决JavaScript浮点数计算精度问题

js精度计算

如何比较浮点数或双精度数? [复制]

VB单精度、双精度浮点数误差,如何消除

JavaScript 浮点数及运算精度调整总结

如何保持浮点/双精度算术确定性?