减去浮点值会产生负面结果

时间:2015-10-08 10:26:15

标签: javascript

我正在尝试简单地减去浮点值,我得到一个奇怪的负零输出:

var pay = -0.33;
var res = parseFloat(pay) + parseFloat(0.11) + parseFloat(0.22);
res = res.toFixed(2);
console.log(res);

输出:-0.00

4 个答案:

答案 0 :(得分:1)

这里没什么奇怪的,这就是IEEE浮点运算的方式。

由于您在此处所做的是格式化货币值,我建议您编写一个可重复使用的功能,以便在整个应用中始终如一地完成。

有几种方法,但要使用哪种方法取决于应用程序

这不是一个错误。 -0作为IEEE浮点中的值没有任何问题:-0 === 0,x + -0 = x,x * -0 = -0等。 算术减0的工作方式与0完全相同。

通常我会在格式化时处理-0.00,因为只有-0.00"看起来很奇怪",-10.20只是透支:)

res = res.toFixed(2);
if(res === '-0.00'){
  res = '0.00';
}

我建议本文更好地理解IEEE浮点数:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:0)

实际上这里发生的是没有大于或等于负数的初始正数。如果你想得到一个正值,那么正数应该大于或等于负数 我想说的是: 如果你这样做: -0.33-0.11 + 0.44然后你会得到一个正零值,因为初始正值大于所有负数。

答案 2 :(得分:0)

javascript和机器在总句柄中以双倍几乎无限的数字。

当舍入到2位小数时,javascript给出最接近的舍入数。

修复它,使用:

var pay = -0.33;
var res = parseFloat(pay) + parseFloat(0.11) + parseFloat(0.22);
res = res.toFixed(2);
return (Math.round(res * 100) / 100);

比其他的解决方法更好的方法是评估字符串..

修改

如果你更改了整数,最好使用它:

var fixRound = 2,
    pay = -0.33,
    rounding = Math.pow(10, fixRound),
    res = parseFloat(pay) + parseFloat(0.11) + parseFloat(0.22);
    res = res.toFixed(fixRound );
    return (Math.round(res * rounding ) / rounding );

这样,你需要在代码中进行更改以使其与toFixed(3),toFixed(4),toFixed(5)等一起工作,只需将fixRound值设置为你希望的数字。

答案 3 :(得分:0)

这是我发现的一种解决方案,可防止toFixed返回负零:

package main import "fmt" // user defines a user in the program. type user struct { name string email string status string } func debug(u user) { fmt.Printf("%+v\n", u) } // notify implements a method with a value receiver. func (u user) notify() { fmt.Printf("User: Sending User Email To %s<%s>\n", u.name, u.email) } // changeEmail implements a method with a pointer receiver. func (u *user) changeEmail(email string) { u.email = email } func (u *user) changeName(name string) { u.name = name } func (u *user) Send() { u.notify() } // main is the entry point for the application. func main() { // Pointers of type user can also be used to methods // declared with a value receiver. john:= &user{"John", "john@exemple.com", "enabled"} john.changeName("John Smith") john.changeEmail("john@gmail.com") john.notify() Receive(john)