C++ 将 SATOSHI(uint64_t) 转换为没有 float / double 的 BTC(字符串)

标签 c++

我需要构建一个函数,它接受 uin64_t (SATOSHI) 并输出一个带有 BTC 值的字符串。 有人告诉我在没有任何除法/ float 的情况下这样做,所以应该涉及纯字符串操作。这是因为如果我选择 Satoshi/1BTC,我最终会得到一个很好的值(value),但无法将其正确转换为字符串(由于四舍五入)

想不出办法怎么做,知道:

uin64_t uiSatoshi = 1033468;
uint64_t uiOneBTC = 100000000;
std::string strBTC = "";

如何从 UiSatoshi 构造 strBTC,知道 BTC 有 8 位小数。

尝试过:

// SATOSHI TO STRING (for exchange)  
    int iSatoshi = 1033468;
    double dVal = (double)iSatoshi / (double)100000000;


    std::ostringstream out;
    out << std::setprecision(8) << dVal;
    std::string strOutput = out.str();

    printf("WRONG: %f\n", dVal);
    printf("TEST: %s\n", strOutput.data());

错误:0.010335 测试:0.01033468

但是当uiSatoshi的值为101033468时失败了 由于结果是圆的:TEST: 1.0103347

我想避免进行浮点运算,只需用我拥有的整数制作一个字符串,添加前导零并在需要的地方放置点。

更新: 答案张贴在这里:C++ printf Rounding?

最佳答案

一个简单的转换例程如下:

#include <iostream>
#include <string>

using namespace std;

string to_btc(uint64_t sat) {
  auto s = to_string(sat);

  if (s.length() < 8) {
    // Prefix with 0s
    s.insert(0, (8 - s.length()), '0');
    s.insert(0, "0.", 2);
  } else if (s.length() == 8) {
    s.insert(0, "0.", 2);
  } else {
    // Insert a '.' in the right place
    s.insert(s.length() - 8, 1, '.');
  }
  return s;
}

int main ()
{
  cout << to_btc(10346834567ULL) << endl;
  cout << to_btc(1034683456ULL) << endl;
  cout << to_btc(103468345) << endl;
  cout << to_btc(10346834) << endl;
  cout << to_btc(1034683) << endl;
  cout << to_btc(10368) << endl;
  cout << to_btc(1038) << endl;
  cout << to_btc(132) << endl;
  cout << to_btc(18) << endl;
  cout << to_btc(1) << endl;
  cout << to_btc(0) << endl;
}

不需要花车,我并不是说这已经完成并可以投入生产,但我相信您可以对其进行彻底测试,以检查它是否符合您的预期。它可以被优化吗 - 可能,但我会把它留作练习......

关于C++ 将 SATOSHI(uint64_t) 转换为没有 float / double 的 BTC(字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479011/

相关文章:

c++ - 确定正确的 protobuf 类

c++ - g++ -m32 在 debian amd64 上找不到 libstdc++

c++ - 为什么 "n"在此函数中没有递增?

c++ - 这个 result_of 用法有什么问题?

c++ - 如何将字符转换为 float ?

c++ - 二维卷积 - 与 opencv 输出相比的错误结果

c++ - float 模板特化

c++ - 在 Windows 2008 64 位中创建注册表项

c++ - 如何使用 tolua++ 将 lua 字符串(二进制)传递给 c++

c++ - FFTW 与 Matlab FFT