请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我知道因UIKit
使用CGFloat
分辨率独立坐标系而使用.
但我想,以检查是否例如每次frame.origin.x
是0
它让我感到恶心:
if (theView.frame.origin.x == 0) {
// do important operation
}
Run Code Online (Sandbox Code Playgroud)
是不是CGFloat
有比较时容易误报==
,<=
,>=
,<
,>
?这是一个浮点,他们有不寻常的问题:0.0000000000041
例如.
Objective-C
在比较时是在内部处理这个,还是可能发生origin.x
读取为零的情况并不是0
真实的?
以下代码显然是错误的.有什么问题?
i <- 0.1
i <- i + 0.05
i
## [1] 0.15
if(i==0.15) cat("i equals 0.15") else cat("i does not equal 0.15")
## i does not equal 0.15
Run Code Online (Sandbox Code Playgroud) 根据这个java.sun页面 ==
是Java中浮点数的相等比较运算符.
但是,当我输入以下代码时:
if(sectionID == currentSectionID)
Run Code Online (Sandbox Code Playgroud)
进入我的编辑器并运行静态分析,我得到:"JAVA0078浮点值与==相比"
使用==
比较浮点值有什么问题?这样做的正确方法是什么?
我知道大多数小数都没有精确的浮点表示(浮点数学是否被破坏?).
但我不明白为什么4*0.1
打印得很好0.4
,但3*0.1
不是,当两个值实际上都有丑陋的十进制表示时:
>>> 3*0.1
0.30000000000000004
>>> 4*0.1
0.4
>>> from decimal import Decimal
>>> Decimal(3*0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(4*0.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')
Run Code Online (Sandbox Code Playgroud) 在以下示例中是否可以将除以0(或无穷大)?
public double calculation(double a, double b)
{
if (a == b)
{
return 0;
}
else
{
return 2 / (a - b);
}
}
Run Code Online (Sandbox Code Playgroud)
在正常情况下,它当然不会.但是,如果a
并且b
非常接近,可能会(a-b)
导致0
计算的精确性?
请注意,这个问题适用于Java,但我认为它适用于大多数编程语言.
有没有办法以编程方式获得最接近1.0的double,但实际上不是1.0?
一种hacky方法是将double转换为相同大小的整数,然后减去一个.IEEE754浮点格式的工作方式,最终将指数减少一,同时将小数部分从全零(1.000000000000)更改为全1(1.111111111111).但是存在一些机器,其中整数存储为little-endian而浮点存储为big-endian,因此并不总是有效.
我y
在javascript中有大量的数值.我想通过将它们舍入到最接近的倍数来对它们进行分组x
,并将结果转换为字符串.
如何绕过恼人的浮点精度?
例如:
0.2 + 0.4 = 0.6000000000000001
Run Code Online (Sandbox Code Playgroud)
我尝试了两件事:
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
Run Code Online (Sandbox Code Playgroud)
和:
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
Run Code Online (Sandbox Code Playgroud) javascript floating-point double floating-accuracy numerical-methods
$a = '35';
$b = '-34.99';
echo ($a + $b);
Run Code Online (Sandbox Code Playgroud)
结果在0.009999999999998
怎么了?我想知道为什么我的程序会报告奇怪的结果.
为什么PHP没有返回预期的0.01?
我试图将十进制数截断为小数位.像这样的东西:
5.467 -> 5.46
985.943 -> 985.94
Run Code Online (Sandbox Code Playgroud)
toFixed(2)
做正确的事情,但它完成了价值.我不需要四舍五入的值.希望这在javascript中是可能的.