<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E4%B8%BA%E4%BB%80%E4%B9%880.1%2B0.2%21%3D0.3</id>
	<title>为什么0.1+0.2!=0.3 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E4%B8%BA%E4%BB%80%E4%B9%880.1%2B0.2%21%3D0.3"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E4%B8%BA%E4%BB%80%E4%B9%880.1%2B0.2!%3D0.3&amp;action=history"/>
	<updated>2026-05-19T14:19:53Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E4%B8%BA%E4%BB%80%E4%B9%880.1%2B0.2!%3D0.3&amp;diff=2117&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:计算机基础  == 0.1+0.2=0.30000000000000004？ ==  使用常用的语言计算“0.2+0.1”的时候，结果不是“0.3”，而是“0.3000000…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E4%B8%BA%E4%BB%80%E4%B9%880.1%2B0.2!%3D0.3&amp;diff=2117&amp;oldid=prev"/>
		<updated>2021-03-25T12:49:01Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80&quot; title=&quot;分类:计算机基础&quot;&gt;category:计算机基础&lt;/a&gt;  == 0.1+0.2=0.30000000000000004？ ==  使用常用的语言计算“0.2+0.1”的时候，结果不是“0.3”，而是“0.3000000…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:计算机基础]]&lt;br /&gt;
&lt;br /&gt;
== 0.1+0.2=0.30000000000000004？ ==&lt;br /&gt;
&lt;br /&gt;
使用常用的语言计算“0.2+0.1”的时候，结果不是“0.3”，而是“0.30000000000000004”，而不同的“0.1+0.6”的结果却是“0.7”：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
首先，计算机中是使用二进制表示对应的数值的，十进制整数转二进制采用“除2取余，逆序排列”的方法得到，而小数的转换采用“乘2取整，顺序排列”的方法，如下：&lt;br /&gt;
# 用2乘十进制小数，得到积；&lt;br /&gt;
# 将积的整数部分取出，再用2乘余下的小数部分，又得到一个积；&lt;br /&gt;
# 重复以上两部，直到积中的小数部分为零，此时0或1为二进制的最后一位。或者达到所要求的精度为止。&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  0.625  x  2  =  1.25  整数部分  1&lt;br /&gt;
  0.25   x  2  =  0.5   整数部分  0&lt;br /&gt;
  0.5    x  2  =  1    整数部分  1&lt;br /&gt;
  &lt;br /&gt;
  0.625 的二进制为 0.101&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
但是，并非所有小数都能被表示为二进制，如0.1：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  0.1  x  2  =  0.2  整数部分  0&lt;br /&gt;
  0.2  x  2  =  0.4  整数部分  0&lt;br /&gt;
  0.4  x  2  =  0.8  整数部分  0&lt;br /&gt;
  0.8  x  2  =  1.6  整数部分  1&lt;br /&gt;
  0.6  x  2  =  1.2  整数部分  1&lt;br /&gt;
  0.2  x  2  =  0.4  整数部分  0&lt;br /&gt;
  0.4  x  2  =  0.8  整数部分  0&lt;br /&gt;
  0.8  x  2  =  1.6  整数部分  1&lt;br /&gt;
  0.6  x  2  =  1.2  整数部分  1&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
所以 0.1 的二进制为 0.00011001100110011...，在计算机中并不能被精确表示。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
所以，计算机的单精度、双精度数都是采用近似值表示，只是二者的精度有所不同（32位、64位）：&lt;br /&gt;
&lt;br /&gt;
0.1 的双精度浮点数的二进制为：0.00011001100110011001100110011001100110011001100110011001&lt;br /&gt;
&lt;br /&gt;
0.2 的双精度浮点数的二进制为：0.00110011001100110011001100110011001100110011001100110011&lt;br /&gt;
&lt;br /&gt;
二者相加等于：0.01001100110011001100110011001100110011001100110011001100&lt;br /&gt;
&lt;br /&gt;
转换为十进制：0.30000000000000004&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
所以 0.1+0.2 != 0.3，而是一个近似值。如果要进行高精度计算，应该使用类似“'''BigDecimal'''”的数据类型。&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>