我需要构建一个函数,它接受 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/