如何存储权重值并转换为 standard/metric 权重?
How to store weight values and converting to standard/metric weights?
我正在开发一个 Vue 应用程序,其中一个功能处理权重值。我目前将它们以克的形式存储在我的数据库中,然后将它们转换为磅。最终我希望能够让用户在公制和标准计算之间进行选择。我创建了一个 returns 四次计算的函数,但它们似乎没有正确加起来。
export const convertToPounds = weight => {
return (Math.round((weight / 453.592) * 10) / 10).toFixed(2);
};
这个函数是运行四次。一次用于总数,三次基于项目过滤到的类别。
Total - 4170 grams converts to 9.20 lbs
ValueA - 2700 grams converts to 6.00 lbs
ValueB - 1400 grams converts to 3.10 lbs
ValueC - 70 grams converts to 0.20 lbs
不过,看看最终的转化率,这三个值加起来是 9.30,而不是应返回的 9.20。
我的问题是转换方法是否太不准确,无法处理这些类型的转换?或者以克为单位存储重量不是处理这种情况的最佳方式?
我认为您的问题是您首先对其进行四舍五入,然后执行 toFixed(2) 进一步四舍五入。我简单地检查了 google,它似乎是正确的计算:https://www.google.com/search?q=4170+grams+to+pounds
const convertToPounds = weight => {
return (weight / 453.592).toFixed(2);
};
// Total - 4170 grams converts to 9.20 lbs
console.log(convertToPounds(4170));
// ValueA - 2700 grams converts to 6.00 lbs
console.log(convertToPounds(2700));
// ValueB - 1400 grams converts to 3.10 lbs
console.log(convertToPounds(1400));
// ValueC - 70 grams converts to 0.20 lbs
console.log(convertToPounds(70));
你四舍五入了。你为什么要四舍五入?是不是为了让 UI 不显示长小数?如果是这样,您应该考虑在 UI 级别进行舍入。像这样在数据级别四舍五入是危险的,因为正如您所发现的那样;事情不会在内部加起来,如果你在 另一个计算 中使用它的结果,那么它会漂移并变得更加不准确。
考虑一个过滤器来做到这一点,就像这个要点 (https://gist.github.com/belsrc/672b75d1f89a9a5c192c#file-gistfile1-js-L92):
Vue.filter('round', function(value, decimals) {
if(!value) {
value = 0;
}
if(!decimals) {
decimals = 0;
}
value = Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
return value;
});
长发评论:
不可能有 9.20
这样的确切数字。它们被二进制四舍五入到最接近的可能数字,这里是 9.19999999999999929
。这就是 toFixed()
returns 字符串而不是数字的原因。
此处作为答案提供的函数或表达式也无济于事:
value = Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
如果您通过 console.log(value.toPrecision(18))
验证结果,您会看到,函数失败。所有舍入函数,returns 一个数字将失败。
为什么toPrecision(18)
?浮点数通常作为 IEEE 754 实现。JavaScript 使用 double floats
大约 16 位十进制数字。所以18位数字是内部数字的非常精确的十进制表示。
最后说明:toFixed()
仅用于最终打印。
我正在开发一个 Vue 应用程序,其中一个功能处理权重值。我目前将它们以克的形式存储在我的数据库中,然后将它们转换为磅。最终我希望能够让用户在公制和标准计算之间进行选择。我创建了一个 returns 四次计算的函数,但它们似乎没有正确加起来。
export const convertToPounds = weight => {
return (Math.round((weight / 453.592) * 10) / 10).toFixed(2);
};
这个函数是运行四次。一次用于总数,三次基于项目过滤到的类别。
Total - 4170 grams converts to 9.20 lbs
ValueA - 2700 grams converts to 6.00 lbs
ValueB - 1400 grams converts to 3.10 lbs
ValueC - 70 grams converts to 0.20 lbs
不过,看看最终的转化率,这三个值加起来是 9.30,而不是应返回的 9.20。
我的问题是转换方法是否太不准确,无法处理这些类型的转换?或者以克为单位存储重量不是处理这种情况的最佳方式?
我认为您的问题是您首先对其进行四舍五入,然后执行 toFixed(2) 进一步四舍五入。我简单地检查了 google,它似乎是正确的计算:https://www.google.com/search?q=4170+grams+to+pounds
const convertToPounds = weight => {
return (weight / 453.592).toFixed(2);
};
// Total - 4170 grams converts to 9.20 lbs
console.log(convertToPounds(4170));
// ValueA - 2700 grams converts to 6.00 lbs
console.log(convertToPounds(2700));
// ValueB - 1400 grams converts to 3.10 lbs
console.log(convertToPounds(1400));
// ValueC - 70 grams converts to 0.20 lbs
console.log(convertToPounds(70));
你四舍五入了。你为什么要四舍五入?是不是为了让 UI 不显示长小数?如果是这样,您应该考虑在 UI 级别进行舍入。像这样在数据级别四舍五入是危险的,因为正如您所发现的那样;事情不会在内部加起来,如果你在 另一个计算 中使用它的结果,那么它会漂移并变得更加不准确。
考虑一个过滤器来做到这一点,就像这个要点 (https://gist.github.com/belsrc/672b75d1f89a9a5c192c#file-gistfile1-js-L92):
Vue.filter('round', function(value, decimals) {
if(!value) {
value = 0;
}
if(!decimals) {
decimals = 0;
}
value = Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
return value;
});
长发评论:
不可能有 9.20
这样的确切数字。它们被二进制四舍五入到最接近的可能数字,这里是 9.19999999999999929
。这就是 toFixed()
returns 字符串而不是数字的原因。
此处作为答案提供的函数或表达式也无济于事:
value = Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
如果您通过 console.log(value.toPrecision(18))
验证结果,您会看到,函数失败。所有舍入函数,returns 一个数字将失败。
为什么toPrecision(18)
?浮点数通常作为 IEEE 754 实现。JavaScript 使用 double floats
大约 16 位十进制数字。所以18位数字是内部数字的非常精确的十进制表示。
最后说明:toFixed()
仅用于最终打印。