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

Can the sum of a number, and a percentage of the same number rounded up be reversed in 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

简而言之,它 returns 一个数字的总和和该数字的百分比四舍五入到最接近的百位。

是否可以得到基价(输入,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 问题,但我不确定如何为数学观众设置格式。即使在其他一些程序员的帮助下,我也无法解决这个问题。

像这样,但是因为四舍五入会有差异

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

编辑: 通过使用现有的 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, 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')
}