If statement OCaml中if语句的意外行为

If statement OCaml中if语句的意外行为,if-statement,ocaml,If Statement,Ocaml,我正在学习OCaml,所以可能我写的这个if语句是错误的,但是对于这个语句: 如果0.3-。0.2=0.1,然后是“a”或“b” 输出为: -:char='b' 既然0.3-0.2=0.1,输出不应该是“a”吗? 写==而不是==时的行为也是一样的。浮点值只能近似地表示小数。所以0.3-。0.2非常接近于0.1,但并不完全相等 # 0.3 -. 0.2;; - : float = 0.0999999999999999778 理解这一点对程序员来说是一种成年礼。这是我找到的一个有一些讨论的网站:

我正在学习OCaml,所以可能我写的这个if语句是错误的,但是对于这个语句:

如果0.3-。0.2=0.1,然后是“a”或“b”

输出为:

-:char='b'

既然0.3-0.2=0.1,输出不应该是“a”吗?
写==而不是==时的行为也是一样的。

浮点值只能近似地表示小数。所以0.3-。0.2非常接近于0.1,但并不完全相等

# 0.3 -. 0.2;;
- : float = 0.0999999999999999778
理解这一点对程序员来说是一种成年礼。这是我找到的一个有一些讨论的网站:

作为旁注,您不应该在普通计算中使用==物理相等运算符。例如:

# 1.0 == 1.0;;
- : bool = false
这是另一个问题。浮动值不是那么近似:-


日常工作的相等比较运算符为=。这是你应该使用的,除非你有特定的理由不这样做。

有一个原因。在0.3-。是这样吗?如果我在中运行你的代码,我会因此得到一个“语法错误”。。如果我移除它并再次运行它:如果0.3-0.2=0.1,则“a”或“b”;;它将返回一个错误:此表达式的类型为float,但表达式的类型应为int。因此。这肯定不是有意的:发布的代码没有错,尽管它应该使用普通的ASCII单引号。问题在于浮点值的近似性质。这个OCaml中需要after-来减去浮动值。