【发布时间】:2016-01-29 04:49:16
【问题描述】:
我正在研究一个“玩具问题”,我应该编写一个 JavaScript 函数,将小数转换为分数并将其作为字符串返回。例如:fractionConverter(2.75) 应该返回“11/4”。
这是我的代码:
function fractionConverter (number) {
if (number > 0) {
var isNegative = false;
} else if (number < 0) {
var isNegative = true;
}
number = Math.abs(number);
if (number % 1 === 0) {
var finalFrac = number + "/1";
} else {
for (var i = 2; i < 10000000000; i++) {
if ((i * number) % 1 === 0) {
var finalFrac = (i * number) + "/" + i;
}
if (finalFrac) { break; }
}
}
var getFrac = function(numString, bool) {
if (!bool) {
return numString;
} else {
return "-" + numString;
}
}
return getFrac(finalFrac, isNegative);
}
对格式问题感到抱歉。无论如何,我遇到了一个奇怪的规范失败。该函数返回以下数字的正确值:0.5、3、2.5、2.75、-1.75 和 .88。然而,由于某种原因,它在 0.253213 上失败了。它返回 1266065/5000000 而不是 253213/1000000。不太清楚为什么。
谢谢
【问题讨论】:
-
那是因为
0.253213 * 1000000 === 253213.00000000003。见Is floating point math broken? -
不仅不能用小数准确表示所有分数,ECMAScript 的number values 也不能准确表示所有小数。
-
好的,我投票重新提出这个问题。考虑到浮点数的限制,我想知道解决这个特定问题的最佳方法。
-
@AndrewShepherd—好的,你说得有道理。一定有比 1.0e10 循环更好的方法。 ;-)
标签: javascript numbers decimal fractions