我对PHP和javascript轮数的方式有一些问题.我正在使用PHP的圆函数和这个javascript函数:
function roundNumber(number, decimals) {
var newnumber = new Number(number+'').toFixed(parseInt(decimals));
var value = parseFloat(newnumber);
return value;
}
Run Code Online (Sandbox Code Playgroud)
我试图舍入的数字是43.65*2.5 + 40%,当使用计算器= 152.775或在PHP = 152.78舍入时.
在javascript中我做一个console.log的数字是152.774999999998,当用上面的函数舍入时给我152.77
非常感谢任何帮助重新解决这个问题
我想要舍入1.006到两位小数,期望输出为1.01
当我做的时候
var num = 1.006;
alert(Math.round(num,2)); //Outputs 1
alert(num.toFixed(2)); //Output 1.01
Run Code Online (Sandbox Code Playgroud)
同样的,
var num =1.106;
alert(Math.round(num,2)); //Outputs 1
alert(num.toFixed(2));; //Outputs 1.11
Run Code Online (Sandbox Code Playgroud)
所以
请建议我.
PS:我尝试搜索堆栈溢出类似的答案,但无法得到正确的答案.
EDIT:
为什么1.015返回1.01,其中1.045返回1.05
var num =1.015;
alert(num.toFixed(2)); //Outputs 1.01
alert(Math.round(num*100)/100); //Outputs 1.01
Run Code Online (Sandbox Code Playgroud)
在哪里
var num = 1.045;
alert(num.toFixed(2)); //Outputs 1.04
alert(Math.round(num*100)/100); //Outputs 1.05
Run Code Online (Sandbox Code Playgroud) 好吧,我知道机器精度是多少,但是这个,我无法理解......
码:
console.log("meanX",meanX);
meanX2 = meanX * meanX; //squared
console.log("meanX2",meanX2);
Run Code Online (Sandbox Code Playgroud)
控制台输出:
meanX 300.3
meanX2 28493.4400000000002
Run Code Online (Sandbox Code Playgroud)
如果您想知道,meanX2的正确值将是90180.09 这只是截图中可见的众多示例中的一个.

.toFixed(6)似乎解决了这个问题......但我不知道为什么没有它就行不通.
编辑
好的,我不想在这里发布整个程序代码,因为首先我不是唯一的作者,其次,我也不希望在没有我们许可的情况下复制它.但我很乐意解释如何得到这个错误,并在此处发布整个方法/功能代码.
正如您可能从窗口标题中猜到的那样,此代码属于通道检测算法.我们使用Three.js/webgl在视频的每一帧上运行一些预处理着色器,然后我们分析生成的图像.您在屏幕截图中看到的方法/功能是垂直线拟合算法,是整个事物的一部分.我可以看到算法运行得很好,因为我在视频顶部绘制了通道,并且放置得很好.直到突然车道变成水平杆.这种意外的行为正是因为我在这里描述的现象而发生的,因为从那一刻起我开始在控制台中看到错误的数学.
此外,由于视频和算法每次都以略微不同的fps运行,因此问题并不总是发生在视频的同一时刻,有时它根本不会发生.
这是代码(它有一些改动,因为我试图隔离问题):
this.perpendicularLineFit = function (points, slopeSign) {
var count = points.length;
var sumX = 0,
sumY = 0;
var sumX2 = 0,
sumY2 = 0,
sumXY = 0;
var meanX, meanY;
var i, lowp = {}, highp = {};
var B;
var slope;
var originY;
for (i = 0; i < count; i++) {
sumX += points[i].x; …Run Code Online (Sandbox Code Playgroud) 我正在使用JavaScript中的函数.我取两个变量x和y.
我需要划分两个变量并在屏幕上显示结果:
x=9; y=110;
x/y;
Run Code Online (Sandbox Code Playgroud)
然后我得到的结果如下:
0.08181818181818181
我需要使用BigDecimal.js我在另一篇文章中找到的东西.
我希望结果显示为:
0.081
我听说 javascript数字是IEEE 754浮点数,这就解释了原因
> 0.3 - 0.2
0.09999999999999998
Run Code Online (Sandbox Code Playgroud)
但我不明白
> 0.1
0.1
Run Code Online (Sandbox Code Playgroud)
我认为0.1无法准确地存储为基础2浮点,但它会向后打印,就像它一直是0.1.是什么赋予了?解释器打印之前是否进行了一些舍入?
至少有两个版本的IEEE 754:1984版本和2008年,这对我没有帮助.听起来后者增加了对十进制算术的完全支持.似乎我们没有.
所以我有一个Javascript脚本,它在一个循环中添加小分数,并且它可能会增加0.2到0.1.然后该值被送到另一个函数,但问题是我需要0.3准确输入而不是0.30000000000000004.
什么是确保数字得到纠正和准确的最简单方法.注意,可以将0.25 + 0.125等添加到简单舍入到1的十进制将无法解决问题.
也可以添加0.2 + 0.10000000000000004,尽管这非常非常不可能!
根据我的阅读,JavaScript中的数字实际上存储为浮点数,并且没有真正的整数类型.这准确吗?
如果没有整数类型,那么我该如何准确存储货币?作为一个字符串或什么?
这是一个示例程序:
var a = parseFloat("86.69043189999999") + "<br>";
var b = parseFloat("86.79718199999999") + "<br>";
var n = a + b;
document.getElementById("demo").innerHTML = n;Run Code Online (Sandbox Code Playgroud)
<p id=demo></p>Run Code Online (Sandbox Code Playgroud)
这两个变量都具有完全相同的小数点,它仍然提供两种不同的输出:
86.6904319
86.79718199999999
Run Code Online (Sandbox Code Playgroud)
为什么会出现如此奇怪的行为?
如果我做0.3 - 0.2它给0.9999999998不是0.1有没有办法让它给出一个十进制的percise?如果计算器不精确,就不能相信它.
我正在尝试使用此脚本计算 EMA。但它没有给我正确的 EMA。这可能有很多原因,但我不确定是什么。我尝试了不同的 EMA 公式,但没有任何更好的结果,我真的不是专业的编码员,也不是数学家,因此我看不出我做错了什么。
随着时间的推移,EMA 值是如何计算的?对于第一个值,我使用 SMA 计算第一个 EMA,我想这应该可行 - 对吧?
我的 EMA 值= 0.033144798412698406
实际 EMA 值= 0.033084
Close = last closing price
Period = 20;
Multiplier = (2 / (period + 1));
function calculateEMA() {
if (EMA == 0) {
EMA = (Close - SMA) * multiplier + SMA;
calculateEMA();
} else {
for (a = 0; a < period; a++) {
EMA = (Close - previous_ema) * multiplier + previous_ema;
console.log(EMA + " ema"); …Run Code Online (Sandbox Code Playgroud) javascript ×10
fixed-point ×1
ieee-754 ×1
math ×1
node.js ×1
numbers ×1
parsefloat ×1
php ×1
rounding ×1