如何计算小数点前后的位数?

Naf*_*war -4 c++ loops decimal-point

今天在我的c ++课堂测试中提出了一个问题."编写一个输入浮点数的程序,并计算小数点前后的位数."

我用这段代码计算了小数点前的数字:

float n;

cin>>n;

float temp = n;

int count = 0;

while(temp1 > 1) {

    count++;

    temp = temp/10;
}

cout<<count;
Run Code Online (Sandbox Code Playgroud)

部分之后我坚持了下来.谁能告诉我怎么做?或者可以提供整个程序?

提前致谢,

πάν*_*ῥεῖ 5

编写一个输入浮点数的程序,并计算小数点前后的位数.

好吧,因为该任务要求使用float标准c ++ 不能真正解决的问题,因为float值指数和尾数的二进制表示没有在c ++标准中定义.
因此,您无法知道将使用多少位来表示数字的小数部分,除非您知道c ++编译器如何实现float(或double)二进制表示.

最有可能的是,实现针对目标CPU及其处理浮点值的能力进行了优化.


因此,您唯一的机会是将数字作为第一位的std::string表示读取,计算出在字符之前和之后出现的数字,'.'最后将std::string变量转换为float值.


这是一个简单的例子,我的答案的第一部分是什么意思:

#include <iostream>
#include <iomanip>
#include <limits>
#include <cmath>
#include <sstream>

int main() {

    std::istringstream iss("3.1415"); // same as reading from cin
    std::cout << "Input: " << iss.str() << std::endl;
    float temp;
    iss >> temp;
    std::cout << "Internal representation: " 
              << std::fixed << std::setprecision(22) << temp << std::endl;
    float fraction = temp - abs(temp);
    int fractiondigits = 0;
    while(fraction > std::numeric_limits<float>::epsilon()) { // epsilon is the smallest 
                                                              // value that can be 
                                                              // represented in binary form
        fraction *= 10.0f;
        fraction -= abs(fraction);
        ++fractiondigits;            
    }
    std::cout << "Number of digits used in the representation: " 
              << fractiondigits << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出是

Input: 3.1415
Internal representation: 3.1414999961853027343750
Number of fraction digits used in the representation: 21
Run Code Online (Sandbox Code Playgroud)

Live Demo


所以你看到这与用户的输入不一致.

我不知道你的教授是否打算询问并让你承认用户输入和内部代表的不一致float.
但是如上所述,实际的位数是编译器实现和平台相关的,所以对于小数位数没有明确的答案.