记C语言浮点数运算处理 "坑" 一则

看一小段C语言程序:


int main()
{
float x = 1.3;
x = x - (int)x;
int i = (int)(x*10);
return 0;
}

在你心目中, 变量 I 是怎样的结果?

如果你理所当然地认为是3的话, 那么你就错了~~~

实际结果应该是2.   为什么?

简而言之, x在内存的值并不是精确的1.3, 实际上可能是1.29999999......

因为在计算机组成原因中有说过, 浮点数无法被准确地表示出来, 只能是一个非常精确的值..

就算现在你已经知道这个"坑"了, 但还是不小心会犯, 所以务必要牢记~~~

处理办法:

1. 使用精度更高的double.

2. 取整之前四舍五入(加上一个非常小的0.00000.......005, 但要注意浮点数的精度范围), 就像下面这样.


int main()
{
float x = 1.3;
x = x - (int)x;
int i = (int)(x*10+0.00005);
return 0;
}

同时也要值得注意的是, 这个四舍五入的操作只能用于取整的时候, 你不能加在原浮点值上面改变了原来的浮点数值.

女孩不哭 @ cnblogs.com/memset @ 2014-05-02

记C语言浮点数运算处理 "坑" 一则,布布扣,bubuko.com

时间: 2024-12-17 00:52:47

记C语言浮点数运算处理 "坑" 一则的相关文章

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数. [1]典型的比如相对于浮点数的定点数(Fixed Point Num

【转】javascript 浮点数运算问题

大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13); 结果居然是592.800000000001,当然加法之类的也会有这个问题 那这是js的错误吗? 当然不是,你的电脑做着正确的二进制浮点运算,但问题是你输入的是十进制的数,电脑以二进制运算,这两者并不是总是转化那么好的,有时候会得到正确的结果,但有时候就不那么幸运了 alert(0.7+0.1);//输出0.7999999999999999 alert(0.6+0.2);//输出0

深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer12.html 前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题.这一点其实在我们平时的计算当中会经常出现,就比如之前我们提到过的0.3,它就是无法用浮点小数准确表示的. 为此LZ专门写了一个小程序,使用Java语言打印出了0.3的二进制表示,

【转载】程序员必知之浮点数运算原理详解

https://blog.csdn.net/tercel_zhang/article/details/52537726 导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计

浮点数运算和金额处理

做一个用户中奖记录页面,展示每条记录和总金额,遇到浮点数相加出现问题. Js的浮点数在比较或者做运算的时候会不准确,这个只在初学js的时候读到过概念性的东西,这次就遇到了就在这里记一笔,做一下相关拓展,网上处理的方法也很多,这里摘要一些博主的. 浮点数运算: 转自:https://blog.csdn.net/u013347241/article/details/79210840 思路是将小数转成整数来运算,之后再转回小数. 'use strict' var accAdd = function(n

【javascript】浮点数运算问题分析及解决方法

问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的数字都是以 IEEE-754 标准格式表示的.浮点数的精度问题并不是 js 特有的,因为有些小数以二进制表示位数是无穷的,比如 1.1,其程序实际上无法真正的表示 1.1,而只能做到一定程度上的准确(1.09999999999999999),这是无法避免的精度丢失. 通过 chrome 控制台,我们

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变

高精度浮点数运算

/* Name: 高精度浮点数运算 Copyright: Author: 巧若拙 Date: 08-11-14 10:17 Description: 本程序实现了高精度浮点数的加法,减法,乘法,乘方和除法运算,有效数字精确到MAX. 为了便于进位,本程序采用了较为独特的数据结构,即把浮点数分成整数和小数部分,分别存储在两个不同的数组中. 其中整数部分数字存储在ValInt[MAX-lenInt...MAX) ,小数部分数字存储在ValDec[1...lenDec],ValDec[0]用来存储进位

黑马程序员 ---- C 语言的运算及流程控制

C 语言的运算及流程控制         一. 运算部分:         C语言中的类型转换  强制类型转换 int b = (int) 10.5          // double -> int 自动类型转换 int a = 10.6 // double -> int int b = 10.5 + 1.7  // 自动将大型转换为了小数类型,会丢失精度 自动类型提升 int b = 10.5 +10;  // int -> double       将右边的10 提升为了doubl