double 2 long

3 отговора 78 прегледа
#1

double 2 long

Иамам следният неприятен (меко казано) проблем.

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

cnv(char *cp)
{
int i; double d; long l;
d=(double)(atof(cp)*(double)100.0);
l=(long)d;
i=(int)d;
printf("%d %ld %f\n",i,l,d);
}

main()
{
cnv("4.70");
cnv("4.80");
cnv("4.60");
cnv("4.59");
}

Резултат:
470 470 470.000000
479 479 479.000000
459 459 459.000000
458 458 458.000000

Горният код е компилиран с GCC, MSC6, LCC, VC6++...на различни платформи и резултатът в общи линии е аналогичен. Някаква идея по въпроса?!

Отговор
в отговор на diver #2

Re: double 2 long

d=(double)(atof(cp)*(double)100.0);
d=d+0.5;
l=(long)d;

Отговор
в отговор на mn_t #3

Re: double 2 long

xaxaxa tva ot BASIC v0.0000 ne go bqh pravil. ama to ba4ka ako ima6 primerno int 5 = ((int 5/2 *2)/10)*10... :) maitap4e....

Отговор
в отговор на diver #4

Re: double 2 long

cnv(char *cp)
{
int i; double d; long l;
d=(double)(atof(cp)*(double)100.0);
l=(long)d;
i=(int)d;
printf("%d %ld %.17f\n",i,l,d);
}
Резултат:
470 470 470.00000000000000000
480 480 480.00000000000000000
459 459 459.99999999999994316
459 459 459.00000000000000000


cnv(char *cp)
{
int i; double d; long l;
d=(double)(atof(cp)*(double)100.0) + 0.5;
l=(long)d;
i=(int)d;
printf("%d %ld %.17f\n",i,l,d);
}

Резултат:
470 470 470.50000000000000000
480 480 480.50000000000000000
460 460 460.49999999999994316
459 459 459.50000000000000000

Това с gcc-3.2.3

Отговор