我正在尝试简单地减去浮点值,我得到一个奇怪的负零输出:
var pay = -0.33;
var res = parseFloat(pay) + parseFloat(0.11) + parseFloat(0.22);
res = res.toFixed(2);
console.log(res);
输出:-0.00
答案 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)