【问题标题】:How does stringstream work when converting a double value into a char variable将 double 值转换为 char 变量时 stringstream 如何工作
【发布时间】:2020-06-02 23:20:43
【问题描述】:

我在这里看到了一篇文章,询问如何将双变量值转换为 char 数组。有人说只使用 stringstream 但没有解释它为什么起作用。我尝试使用谷歌搜索,但找不到任何关于它如何转换的文档。我想知道是否有人可以向我解释它是如何工作的。这是我编写的将 double 变量值转换为 char 数组的代码。

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
   double a = 12.99;
   char b[100];
   stringstream ss;

   ss << a;
   ss >> b;
   cout << b; // it outputs 12.99

   return 0;
}

【问题讨论】:

标签: c++ stringstream


【解决方案1】:

当您执行ss &lt;&lt; a; 时,您将在stringstream 中插入双精度(假设它在string 中保存值),因此当您运行ss &gt;&gt; b; 时,它只会复制@ 中的string 987654328@ char by char.
现在唯一的一点是将double转换为string,这可以通过简单的算法实现:

std::string converter(double value){
    char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    bool is_negative = value < 0;
    std::string integer_to_string;
    value =  is_negative ? value * -1 : value; // make the number positive
    double fract = value - static_cast<unsigned int>(value); // fractionary part of the number
    unsigned int integer = static_cast<int>(value); // integer part of the number
    do{
        unsigned int current = integer % 10; // current digit
        integer_to_string = std::string(1, digits[current]) + integer_to_string; // append the current digit at the beginning
        integer = integer / 10; // delete the current digit
    } while(integer > 0); // do over and over again until there are digits
    integer_to_string = (is_negative ? "-" : "") + integer_to_string; // put the - in case of negative
    std::string fract_to_string;
    if(fract > 0) {
        fract_to_string = ".";
        do {
            unsigned int current = static_cast<int>(fract * 10); // current digit
            fract_to_string = fract_to_string + std::string(1, digits[current]); // append the current digit at the beginning
            fract = (fract * 10) - current; // delete the current digit
        } while (fract > 0);
    }
    return integer_to_string + fract_to_string;
}

请记住,这是一个非常基本的转换,由于operator-在浮点运算中的不稳定,会产生很多错误,因此很不稳定,但这只是一个示例

注意:这绝对是为了避免在遗留(实际上不仅仅是遗留)代码中使用,它只是作为一个例子完成的,你应该使用 std::to_string() 来更快地执行它并且没有任何类型的错误(检查this)

【讨论】:

  • @LunyJake 我已经发布了进行第一次转换的算法,如果它回答了您的问题,请将其标记为正确答案
  • 为什么要编写自己的转换? cplusplus.com/reference/string/to_string
  • @NathanielJohnson 向 Luny 展示它是如何执行的,这不是一个黑匣子
  • 这很公平。可能会指出它不推荐使用模板版本
  • @NathanielJohnson 添加了
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2019-11-22
相关资源
最近更新 更多