C++ 当取为双精度时,实际值不存储在变量中

C++ 当取为双精度时,实际值不存储在变量中,c++,double,cin,C++,Double,Cin,当我输入l=1 r=9999999999999 k=100000000时,r的值更改为 1.0e+18.如何获取实际变量输入? 这是我的代码: #include<stdio.h> #include<iostream> #include<iomanip> using namespace std; #define ll long long int main() { double l, r,k; cin >> l >> r &

当我输入l=1 r=9999999999999 k=100000000时,r的值更改为 1.0e+18.如何获取实际变量输入? 这是我的代码:

#include<stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
#define ll long long
int main() {
    double l, r,k;
    cin >> l >> r >> k;
    double i = 1,c=0;
    while (i<=r)
    {
        if (i >= l) {
            cout <<fixed<<setprecision(0)<< i << " ";c++;
        }
        i *= k;
    }
    if (c == 0)cout << -1;
    cout << endl;
}
#包括
#包括
#包括
使用名称空间std;
#定义ll long long
int main(){
双l,r,k;
cin>>l>>r>>k;
双i=1,c=0;
while(i=l){

cout您为
r
,99999999999999999输入的值具有18位精度。但是,
双精度
变量可以表示略少于16位的值;因此,您的值将四舍五入到1.0e+18。为了好玩,尝试在值上加1,并将其与原始值进行比较-您会发现它们是相等的。而不仅仅是'c'lose'-equal。没错-
r==r+1

对于浮点数的一些复杂的教程,我建议你


祝你好运。

要回答你的第二个问题,你可以将999999999999999999存储为
long
,因为它有更多的精度位。(它只支持整数,所以指数不需要位).

因此,问题仍然存在,但也要感谢您的帮助和链接。如果您希望此功能按预期工作,您可以尝试将
r
的类型更改为
long
。但是,基本问题是“如何在不损失精度的情况下处理大小数字”为了解决这个问题,你需要考虑一个类库,它可以处理超过内置硬件相关类型提供的精度或规模的数字。一个这样的类LIB是最好的运气。那个<代码>定义< /COD>真的伤害了我的眼睛…如果你想保存输入,使用一个字符串而不是一个数字。体育课