所以我有一个例如"-389761456.6570000000"
的字符串,我需要将这个数字四舍五入到dor后面的4个字符。我为此写了一个完整的函数,但它太长了(100行)。
我不能像这样转换它:
void Calculator::Display(string a)
{
long double q = stod(a);
cout << setprecision(4) << q << endl;
}
因为它看起来像这样(3.89e ^ -10等)(只是一个例子而不是真实的结果)
我想要这样的smth "-389761456.6570"
有没有办法做到这一点?
答案 0 :(得分:3)
当然,它只需要一些代码行;当然不是100.只考虑舍入规则:舍入到4位数,查看第5位数;如果它大于'5'
,请在第4位加一;如果它小于'5'
,则仅保留第4位数字;如果它恰好是'5'
,如果第四位数之后的任何内容不为零,则将第一位数加1;否则,应用你的抢七规则(从圆到偶,从圆到奇,向零舍入等)。当您向第4位添加一个数字时,它可能会从'9'
翻转到大于'9'
的某个位置;如果发生这种情况,请在第3位数字中加1,等等。完成所有操作后,丢弃第4位后的字符。
答案 1 :(得分:0)
这应该做你想要的。但是,使用系统库来实现这一点要容易得多。
#include <iostream>
#include <string>
void increment( std::string& num )
{
for ( auto ch = num.rbegin(); ch != num.rend(); ch++ )
{
switch ( *ch )
{
case '9':
*ch = '0';
case '.':
continue;
case '-':
num.insert( 1, 1, '1' );
return;
default:
(*ch)++;
return;
}
}
num.insert( 0, 1, '1' );
}
std::string round( const std::string& num, size_t precision )
{
size_t dot = num.find( '.' );
if ( dot == std::string::npos || dot + precision >= num.size() )
{
return num;
}
size_t length = std::min( dot + precision + 1, num.size() );
char lastCh = num[ length ];
std::string result = num.substr( 0, length );
if ( lastCh >= '5' && lastCh <= '9' )
{
increment( result );
}
return result;
}
int main()
{
std::cout << round( "123.45", 4 ) << "\n";
std::cout << round( "123.456", 4 ) << "\n";
std::cout << round( "123.4567", 4 ) << "\n";
std::cout << round( "123.45678", 4 ) << "\n";
std::cout << round( "123.456789", 4 ) << "\n";
std::cout << round( "123.456723", 4 ) << "\n";
std::cout << round( "999.9999995", 4 ) << "\n";
std::cout << round( "-123.456723", 4 ) << "\n";
std::cout << round( "-999.9999995", 4 ) << "\n";
}