浮点型数据转整型的丢失精度问题(C++)

如下代码:http://ideone.com/xcgHgw

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    int i = 0;
    i = 9.0 * 0.6 + 0.6;
    cout << i << endl;

    i = 9.0 * 0.6 + 0.6;
    cout << i << endl;

    i = (double)(9.0 * 0.6 + 0.6);
    cout << i << endl;

    cout << (double)(9.0 * 0.6 + 0.6);
    return 0;
}

本意是打印4个6;

但是打印结果是:

5

5

5

6;

原因是

9.0 * 0.6的返回值很有可能是5.3999...,+ 0.6后是5.9999...;强制转换为int型后是5;

解决方案是:

不要将double型的数据赋给整型,否则可能出现与初衷不符。

时间: 2024-10-26 12:34:35

浮点型数据转整型的丢失精度问题(C++)的相关文章

浮点型数据

浮点型数据不能精确存储,5.21*100 ?=521.00 浮点型数据转整型数据,为了避免因丢失精度导致转换不准确,可加0.5. 显示浮点型字符串,应避免转换为浮点型数据.

程序实现两个整型数值的交换

题目:请写出一个小程序,实现对两个整型数值一个和b的交换 思路1:交换两个数值,最一般的做法,是创建一个临时变量临时,这个变量我们需要的不是它具体的值起到什么作用,而是要借用它所开辟出来的空间,进行被交换变量的暂时存放将一个的值存入临时,再将b存入一个中,然后再将温度里存的一个的值放入b中,即可实现一个与b的交换,如图: ? 1 #include<stdio.h> 2 3 int main() 4 { 5 6 int a = 10, b = 20; 7 int temp; 8 printf(&

隐式类型转换和整型提升

c整型中的运算总是至少以缺省整型类型的精度来进行的,所以当字符型或者短整型在进行运算时为了获得这个精度,先要提升成普通整型,再运算. 例: char a=127; char b=1; char ret=a+b; 在进行运算时,先进行"整型提升"(提升成整形): char类型的127 是:0111 1111 进行整型提升后是:00000000 00000000 00000000 01111111 char类型的1 是:0000 0001 整型提升后是:00000000 00000000

shortlong能够应用到整型shortint或short短整型

得到扩大的数据类型.,unsign能够应用到整型和字符型:ongint或long长整型unsignint 无符号整型unsignshort无符号短整型unsignlong无符号长整型unsignchar无符号字符型C言语的根本数据类型有以下几个 :int整型char字符型float单精度浮点型doubl双精度浮点型别的.> 整型    C标准没有规定各类数据所占内存字节数,一般一个int型数据所占内存与计算机字长巨细一样,为16位或32位 ,short型数据一般占16位,long型数据是32位.

时间字段的类型用时间戳整型还是时间类型

不管做什么项目,必须都得接触的东西就是时间类型.现在用时间戳存储日期数据(整型存储)已经是业界很平常的的事情,网上各大游戏公司,各大开源都是采取整型时间戳存储.整数存日期好处很多,程序判断直读,扩展性好,随意可转换xml,json等格式.不过有一个最大的缺点就是查数据库不直观,也就是说我们用管理工具打开数据库的时候,看到的是一堆数字,维护数据不方便.为了解决这一缺陷,我找到一方法,先上代码: select *,DATE_FORMAT(FROM_UNIXTIME(datetimed/1000),"

长整型Long返回到前端,js出现精度丢失怎么办

前端后接口对接时,如果后台的id或者其他字段使用了长整型Long,就很容易出现js丢失精度问题.用接口工具调用时,往往id返回都是对的,但是一到页面上,js就后缀000.前端说返回的值有问题,F12看看!后端说没问题,Postman看看!这是js支持的问题,解决这个问题的办法很显然,返回字符串即可.怎么实现呢,你可以直接将vo对象的id改成String类型,但是会带来copyProperties的不便,所以见过很多人通过增加虚拟字段实现.下面是一个整体解决方案:(需要略微了解下Spring的消息

浮点型float数据强制转换成int整型

问题:如下代码 想获取某两个Decimal类型数之间的商的大小,结果偶尔出错(请注意是 偶尔) Decima t1; Decima t2; int shang =Convert.ToInt32(t1 / t2) ; 解决方法:将Decimal类型数据强制转换成INT整型时  会有四舍五入的过程.如下,需要用Math.Truncate方法来取整数位.所以区商时必须用此方法取整 问题代码: Decima t1=1.2m; Convert.ToInt32(t1)  得到1 Decima t2=1.7m

以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据

1 // 环境 2 // 3 // php版本 4 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) 5 // Copyright (c) 1997-2017 The PHP Group 6 // Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies 7 // with Zend OPcache v7.0.33-0+deb9u1, Copyrig

java float浮点型数据存储,丢失精度问题

java中float类型为4字节32位,内存中的存储遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e底数m部分:使用二进制数来表示此浮点数的实际值.指数e部分:占用8bit(1个字节)的二进制数,可表示数值范围为0-255.但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数.所以,float类型的指数可从-126到128.底数部分实际是占用24bit(3个字节)的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit. 所以一