Zaokrąglanie liczb do 2 miejsc po przecinku

0

Witam, mam problem z tym prostym zaganieniem a o dziwo moja funkcja niżej nie zwraca poprawnych wyników

 float zaokraglij_2(float liczba)
    {
        float wynik = liczba*100;
        
        
        int a = (int)wynik;
      
        
        wynik =(float)a/100;
        
        
        return wynik
        
        
    }
0
float zaokraglij_2(float liczba)
  {
   return ((int)(liczba*100))/100f; // ewentualnie: return ((int)(liczba*100+0.5))/100f;
  }

Z tym że:

  • wg mnie nie tego potrzebujesz
  • nadal nie będzie to dokładna liczba ponieważ 1/10 nie da się zapisać w reprezentacji binarnej tak samo jak w dziesiętnej nie da się zapisać 1/3
0

Powyższy kod wyrzuca mi błąd:
Invalid digit 'f' in decimal constant

//edit brakowalo kropki przed f

Hmm kurcze, czyli nie ma innej opcji?

0

Jesteś pewny, że nie wystarczy Ci ustawienie precyzji podczas wyświetlania zmiennej?
Jeśli nie... http://ideone.com/VmRrgp

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

int pow_i(int base, int exp){
    int result = 1;
    while (exp){
        if (exp & 1)
            result *= base;
        exp >>= 1;
        base *= base;
    }
    return result;
}

float round_float_precision(float x, unsigned digits){
	unsigned precision = pow_i(10, digits);
	return roundf(x*precision)/precision;
}

int main(void) {
	float x = 123.456;
	printf("Two digits of precision\n");
	printf("- by printf                  - %.2f\n", x);
	printf("- by setting value precision - %f\n", round_float_precision(x, 2));
	return 0;
}

out:

Two digits of precision
- by printf                  - 123.46
- by setting value precision - 123.460000

//EDIT: tyle się spóźnić...

0

113.000000
972.700012
113.000000
109.500000
112.099998
972.200012
112.099998
109.500000
111.300003
971.700012
111.300003
109.500000
110.400002
971.299988
110.400002
109.500000
109.500000
970.799988

Otrzymuje takie wyniki a to nadal nie jest poprawne zaokraglenie ;(

0

A isnieje mozliwość zaokraglenia do 1 liczby po przecinku ? ale doklanie bez jakis resztek na koncu

0

A możesz zapisać 1/3 z jednym znakiem po przecinku aby to nadal zostało 1/3 ?

0

Ok czaje temat, dzieki ;)

1

To pewnie przerost formy nad treścią, ale:

rozwiązanie "produkcyjne" - uniwersalne, do zastosowania w "prawdziwym" oprogramowaniu:

// używa: https://github.com/vpiotr/decimal_for_cpp
#include "decimal.h"

float zaokraglij_2(float liczba)
{
        dec::decimal<2> value(liczba);
        return static_cast<float>(value.getAsDouble());
}

Rozwiązanie "na szybko" - do zastosowania tutaj:

int round(float value) {
  float val1;
  if (value < 0.0f)
    val1 = value - 0.5f;
  else
    val1 = value + 0.5f;
  int intPart = int(val1);
  return intPart;
}

float zaokraglij_2(float liczba)
{
        return round(liczba * 100.0f) / 100.0f;
}

(nie testowałem)

7
double precision = 0.01;
double rounded1 = floor(value/precision+0.5)*precision;
// C++11
double rounded2 =round(value/precision)*precision;

Powyższe podejście jest poprawne tylko jeśli potrzebujesz zaokrągloną wartość do dalszych obliczeń. Jeśli jednak chcesz wydrukować (skonwertować do string-a) to powinieneś to zrobić podczas konwersji:

stringstream stream;
stream << setprecision(2) << value;
string s = stream.str();
0

Dzięki wielkie! Działa poprawnie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1