2010-10-27 4 views

ответ

3

Вы можете умножить на 100, а затем округлить до целого числа. Затем поместите десятичную точку после первых двух цифр.

Например:

void round(double x) 
{ 
    double y = 100 * x; 
    int rounded = (int)(y + 0.5); 
    printf("%lf rounded = %d.%02d\n", x, rounded/100, rounded % 100); 
} 
+1

Обратите внимание, что это все равно будет страдать от ошибок точности IEEE 754, поэтому такие вещи обычно остаются до выхода. –

+2

Нет, этот бит не будет. Краевой кейс для округления равен 0,5, что прекрасно представляется в виде двоичной фракции. То есть номера до 'xxxx.01111111111111111' округляются до' xxxx', а числа из 'xxxx.10000000000000000' up округляются до' xxxx + 1'. (если вы _already_ страдали от ошибок точности IEEE754, это может быть удивительно. Например, если вы считаете, что 'y' содержит' 0.145' - он не может.) – MSalters

0

Заканчивать round() for float in C++, который говорит о том, округляя поплавки хотя и не в 2 местах. Те же основные методы должны работать.

2

Если вы ожидаете точного результата в double или float, это может быть невозможно. Многие числа, которые могут быть точно представлены в двух десятичных цифрах, не могут быть представлены в базовых 2 числах с плавающей запятой вообще, и все, что вы получите, является ближайшим эквивалентом. Например, вы можете обнаружить, что 1.10 застрял в 1.1000000000000001 независимо от того, сколько раз вы пытаетесь его округлить.

0

Вы не указали, какое округление вам нужно. Предполагая, что округление до ближайшего целого числа:

#include <math.h> 
#include <stdio.h> 

double round(double x) { return floor(x * 100 + 0.5)/100; } 

int main() 
{ 
    printf("%g\n", round(12.345)); 
} 

Он печатает 12,35.

Или если вы просто хотите, чтобы напечатать число, округленное до двух знаков после запятой:

printf("%.2f\n", x); 
+0

Вы не пробовали код с 0,145, ? –

+1

На самом деле ОП не указали правила нарушения связи, если вы имеете в виду это. – vitaut

+1

@ Roland Illig: возможно, нет, поскольку IEEE754 не может его представлять. '0.14999999999' следует, конечно, округлить до« 0,14 » – MSalters

2

При печати двойников можно указать точность:

F, F

Двойной аргумент округляется и преобразуется в десятичную нотацию в стиле [-] ddd.ddd, где число цифр после десятичного знака равно спецификации точности. Если точность отсутствует, она принимается равной 6; если точность явно равна нулю, символ десятичной точки не появляется. Если появляется десятичная точка, перед ней появляется как минимум одна цифра.

Try:

printf("%f rounded = %.2f\n", x, x); 

То же самое в C++

std::cout << x << " rounded = " << std::setprecision(2) << x << "\n"; 
+0

Curios, почему кто-то думает, что это неправильно? –

+3

Фактически это не округляет 'x', хотя оно выводит округленное представление' x' (не my downvote btw) – MSalters

+0

Мой аргумент заключается в том, что в вопросе не указано, что он хочет округлить (представление переменной или выход значения). Попытка округлить значение с плавающей запятой обречена на провал (из-за проблем округления). Другая интерпретация заключается в том, что ОП хочет иметь десятичное значение. –

Смежные вопросы