Я делаю расчеты с финансовыми данными в следующем формате:
<up to 5 digits>.<two digits>
По сути, в моей программе я сталкиваюсь с ошибкой с плавающей запятой. Например, если у меня есть:
11.09 - (11.09 * 0.005) = 11.03455
Я хочу быть в состоянии использовать 11.03455
а не то что сгенерировано: 11.0345499999999 …
Я сравниваю значения, которые генерирует моя программа, со значениями в текстовых файлах в строковом формате. Мне нужны только две десятичные точки точности, и я могу округлить. Есть ли способ, которым я могу сократить это до 11.03?
Я думал, что было бы проще, если бы я превратил это в строку и просто проанализировал ее символ за символом, добавив только два символа после «.» персонаж. Это хорошее решение? Есть идеи получше?
Вот что у меня есть:
string dataProcessor::createTwoDec(double price){
string s = to_string(price);
string output = "";
int dist = 0;
int num_wanted = 0;
bool pt_found = false;
for(int i = 0; i < s.length(); i++){
if(s[i] == '.')
pt_found = true;
if(pt_found)
dist++;
if(dist > 3)
break;
output += s[i];
num_wanted++;
}
return output.substr(0, num_wanted);
}
Вы можете использовать следующую формулу для округления на n десятичных знаков (n не слишком большое):
round(x*10^n)/10^n
where n is number of decimal places required.
В вашем случае n равно 5. Следовательно, оно будет
result = round(result*100000)/100000;
Других решений пока нет …