一个数字的总和和四舍五入的相同数字的百分比可以在 Javascript 中反转吗?

问题描述

我正在尝试向后运行计算。获取数字的函数是:

const getPrice = (num,percentage) => num + ((Math.ceil(num/100)*100)*percentage)

getPrice(1000,0.03) // returns 1,030
getPrice(32245,0.03) // returns 33,214
getPrice(52143.23,0.03) // 53709.23

简单来说,它返回一个数字的总和以及该数字的百分比,四舍五入到最接近的百位。

有没有可能得到基价(输入,num)给出函数的结果?

 const getBasePrice = (num,percentage) => {return insertLogicHere}

 getBasePrice(1030,0.03) // returns 1000
 getBasePrice(33214,0.03) // returns 32245
 getBasePrice(53709.23,0.03) // returns 52143.23

我知道这更像是一个数学问题,而不是一个纯粹的 Javascript 问题,但我不确定如何为数学读者设置格式。即使在工作中的其他一些程序员的帮助下,我也无法弄清楚这一点。

解决方法

编辑: 通过使用现有的 getPrice 方法,您可以计算出原始值和新值之间的差异并将其精确反转:

const getPrice = (num,percentage) => num + ((Math.ceil(num/100)*100)*percentage)
const getBasePrice = (num,percentage) => {return Math.floor(num/(1+percentage))}

let num = 53709.23
let percentage = 0.03

let initialReverse = getBasePrice(num,percentage)
let finalReverse = initialReverse - (getPrice(initialReverse,percentage) - num)

console.log(finalReverse) //returns 52143.23

,

像这样,但是由于四舍五入,您会有所不同。

const getBasePrice = (num,percentage) => {return (Math.round((100*num)/(((percentage*100)+100))))}

console.log(getBasePrice(1030,0.03)) // returns 1000
console.log(getBasePrice(33214,0.03)) // returns 32245

编辑

如果删除舍入是和完全匹配。也许您可以在进行操作时这样做,然后在想要显示此值时应用格式。

const getPrice = (num,percentage) => num + (num/100)*100*percentage

console.log(getPrice(1000,0.03)) // returns 1,030
console.log(getPrice(32245,0.03)) // returns 33212.35
console.log(getPrice(1244.124,0.03)) // returns 1281.4477200000001


const getBasePrice = (num,percentage) => ((100*num)/(((percentage*100)+100)))

console.log(getBasePrice(1030,0.03)) // returns 1000
console.log(getBasePrice(33212.35,0.03)) // returns 32245
console.log(getBasePrice(1281.4477200000001,0.03)) // returns 1244.124

,

好的,所以我打电话给我妈妈,她帮我弄清楚了。这里有一些更具体的变量名称,小数点正在修复中,因为我们使用的是美元。

const getBasePrice = (num,percent) => {
  const guess = num / (1 + percent);
  const roundUp = Math.ceil(guess / 100) * 100;
  const stampDuty = roundUp * percent;
  return parseFloat((num - stampDuty).toFixed(2));
};

通过测试:

const getPrice = (num,percentage) => {
  return num + Math.ceil(num / 100) * 100 * percentage;
}
const getBasePrice = (num,percent) => {
  const guess = num / (1 + percent);
  const roundUp = Math.ceil(guess / 100) * 100;
  const stampDuty = roundUp * percent;
  return parseFloat((num - stampDuty).toFixed(2));
};

const testFunction = () => {
  const percent = 0.03
  const number = parseFloat((Math.random() * 100000).toFixed(2))
  const stampDutyPrice = getPrice(number,percent)
  const backNumber = getBasePrice(stampDutyPrice,percent)
  
  return number === backNumber
}

for (let i = 0; i < 100; i++) {
  console.log(testFunction() ? 'test passed' : 'text failed')
}