Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么即使在从int到double的类型转换之后,小数中也没有小数?_C++ - Fatal编程技术网

C++ 为什么即使在从int到double的类型转换之后,小数中也没有小数?

C++ 为什么即使在从int到double的类型转换之后,小数中也没有小数?,c++,C++,从我收集的资料来看,除非分子或分母是浮点数,否则将分数赋给双精度不会正常工作(所谓“不正常工作”,我的意思是小数被截断,我知道数字当然不能存储为分数)。但是,在将int赋给另一个double变量之前,我尝试将int类型转换为double,但仍然不起作用。这没什么大不了的,因为我只需要做一些小的工作,但为什么会这样呢 我在测试时添加了一些代码 #include <iostream> using namespace std; double convert(int v) { re

从我收集的资料来看,除非分子或分母是浮点数,否则将分数赋给双精度不会正常工作(所谓“不正常工作”,我的意思是小数被截断,我知道数字当然不能存储为分数)。但是,在将int赋给另一个double变量之前,我尝试将int类型转换为double,但仍然不起作用。这没什么大不了的,因为我只需要做一些小的工作,但为什么会这样呢

我在测试时添加了一些代码

#include <iostream>
using namespace std;

double convert(int v) {
    return v;
}

int main() {

    int a = 5;
    int b = 2;

    double n;

    n = convert(a) / convert(b);

    cout << n << endl; // Decimals are stored

    a = static_cast<double> (a);
    b = static_cast<double> (b);

    n = a / b;

    cout << n << endl; // Decimals are cut off

    a = (double) a;
    b = (double) b;

    n = a / b;

    cout << n << endl; << // Decimals are cut off

    double c = a;
    double d = b;

    n = c / d;

    cout << n << endl; // Decimals are stored

    return 0;
}
因为

a / b;
是整数除法(因为两个操作数都是
int
),也就是说,输出是整数,在计算结果时,是否将输出赋值为
double
或任何其他值都是无关的。

因为整数除法

<代码> < < <代码> >代码> b/COD>是整数,所以结果也是一个整数,这是C++的规则,所以<代码> 5/2=2 < /COD>。整数
2
然后转换为
double
,然后打印为
2

当你开始除法的时候,你又回到了整数运算。要通过除法将浮点转换为“粘滞”,需要避免将其丢弃。您可以将转换后的值分配给新变量,如中所示

double aa = static_cast<double> (a);
double aa=静态(a);
或者在与除法相同的表达式中进行转换

n = static_cast<double>(a) / b;
n = a / static_cast<double>(b);
n = static_cast<double>(a) / static_cast<double>(b);
n=static_cast(a)/b;
n=a/静态铸件(b);
n=静态浇铸(a)/静态浇铸(b);
这三个选项中的任何一个都将触发浮点除法。

b=(double)b
这将获取一个
int
将其强制转换为
double
。。。并将其再次转换回
int
,因为这是
b
的不可修改类型。
int a = 5;
a = static_cast<double> (a);
a = static_cast<int> ( static_cast<double> (a) );
double aa = static_cast<double> (a);
n = static_cast<double>(a) / b;
n = a / static_cast<double>(b);
n = static_cast<double>(a) / static_cast<double>(b);