javascript - JavaScript 中的 Excel PERCENTRANK.INC

标签 javascript node.js excel excel-formula

是否有准确的方法在 Javascript 中克隆 Excel 的 PERCENTRANK.INC 函数? 我编写了自己的库,并尝试使用以下库 - 结果并不总是匹配。

https://github.com/formulajs/formulajs

https://github.com/malcolmvr/percentile-rank

FormulaJS 与 Excel 的输出很接近,但仍然存在差异。 在下表中,“原始数据”是原始数组,第二列是我尝试使用 PERCENTRANK.INC 函数与第一列中的数据进行比较的值。

https://support.microsoft.com/en-us/office/percentrank-inc-function-149592c9-00c0-49ba-86c1-c1f45b80463a

enter image description here

有没有办法像 Excel 中一样获得该函数的精确结果。我还分享了我的 Node 代码来试验该功能。

const formularjs = require('@formulajs/formulajs');

let array =[71,13,23,32,45,99,103,71,43,11,91,21,45,45,89,66,41,29,66,63];
let compare_array =[11,19,17,31,32,43,71,63,35,13,73,74,81,100,13,41,31,29,31,33];


compare_array.forEach(function(n){

     let pr = formularjs.PERCENTRANKINC(array,n,3);
     console.log(pr); 
 
});

最佳答案

我设法使用您的代码找到了差异

https://github.com/malcolmvr/percentile-rank/blob/master/lib/index.js

我用 VB 重写了它,并进行了一些调整以重现问题。

Sub Button1_Click()
For i = 1 To 20
Cells(i, 4) = prc(Cells(i, 2), True) / 19
Next i
For i = 1 To 20
If Cells(i, 4) = 0 Then Cells(i, 4) = ipp(Cells(i, 2))
Next i
End Sub

Function prc(v, j)
For i = 1 To 20
If v = Cells(i, 1) Then
prc = i - 1
If j Then i = 20 ' if j is true then return first value
End If
Next i
End Function

Function ipp(v)
For i = 1 To 19
If v > Cells(i, 1) And v < Cells(i + 1, 1) Then
x1 = Cells(i, 1)
x2 = Cells(i + 1, 1)
y1 = prc(x1, False) / 19
y2 = prc(x2, False) / 19
ipp = ((x2 - v) * y1 - (x1 - v) * y2) / (x2 - x1)
End If
Next i
End Function

截图

percentrank.inc

第一列是排序后的原始数据 - 除非是这种情况,否则您的函数将无法工作。第二个是测试值,第三个是 Excel 的 PERCENTRANK.INC,第四个是我的函数(到 3dp,而不是 3sf)。

问题来自于包含多个条目的数据,例如 71 在原始数据中出现了两次。

找到直接匹配项时,将返回找到的第一个值。当数据被插值时,返回最后值。

在我的代码中使用 bool 标志 j 来确定要返回哪个值(第一个或最后一个)来解决这个问题。

关于javascript - JavaScript 中的 Excel PERCENTRANK.INC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68420751/

相关文章:

javascript - 如何从网页中删除选择标记

javascript - 如何在 JavaScript(客户端)端创建类似 PHP session 的页面访问计数

node.js - 基于位置的结果

vba - Excel 三重(多个)VLOOKUP 以及两个工作表上的串联 VLOOKUP 值

javascript - 设置 AMCharts ScrollBar 的初始范围

javascript - 如何用模式分割字符串而不丢失任何文本?

node.js - 使用 Angular.js 将 mongoDB 对象中的项目从上到下排列到列表中

javascript - Node.js 最简单的代码不起作用

Excel VBA运行时错误5使用超链接函数

sql-server - Excel 中的超时,在 SSMS 中立即执行