gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:47:52 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com