6.25 - > 06:15
Saludos.
Escrito 07 septiembre 2012 - 08:50
6.25 - > 06:15
Escrito 07 septiembre 2012 - 09:10
var f: Double; begin f:= 6.25 / 24; ShowMessage(FormatDateTime('hh:mm',TDateTime(f))); end;
Escrito 07 septiembre 2012 - 10:07
Escrito 07 septiembre 2012 - 10:14
var f: Double; begin f:= (6.25 + 0.01) / 24; ShowMessage(FormatDateTime('hh:mm',TDateTime(f))); end;
Escrito 07 septiembre 2012 - 04:49
Escrito 08 septiembre 2012 - 12:18
Escrito 08 septiembre 2012 - 01:31
y por qué el + 0,01?? No lo entiendo :/
Escrito 08 septiembre 2012 - 12:27
Pues si... no hay otra explicación pero de todas formas es extraño porque el tipo Double ya de por si es bastante preciso como para fallar en el orden de los 0,0001 cuando sus operaciones son exactas y aseguradas en los 13 decimales, dejando una ventana de "gracia" a los dos últimos.Sospecho que el problema es el redondeo de los decimales. Un minuto (en un TDateTime) es igual a 0,000694444444444444, y como "DecodeDate" utiliza multiplicaciones y divisiones enteras una simple diferencia, aunque sea muy pequeña, puede hacer que le falte un minuto. Por eso si aumentamos el valor de la variable en 0,01 (puede que incluso 0,001) la división ya nos da correcta.
Uno puede utilizar el tipo TTimeStamp, que está pensado para trabajar con mejor precisión en el órden de los milisegundos. El tipo está pensado como un record, que almacena en formato entero la parte fecha y otro para la parte de la hora.No entiendo porque pascal utiliza esta forma de almacenar fechas, en otros lenguajes almacenan segundos, incluso milisegundos, como un entero. Ocupa mas sitio en memoria pero es indudable que es mucho mas preciso. ¿Otro misterio que habrá que investigar?
Escrito 08 septiembre 2012 - 07:02
var numeroStr: string; numero: float; begin numero: 6.1; numeroStr := FormatFloat('00.00',Numero); numeroStr := StringReplace(numeroStr,'.',':',[rfReplaceAll]); shoMessage( numeroStr ); end;
Escrito 08 septiembre 2012 - 09:50
Escrito 08 septiembre 2012 - 10:21
Ummm...
Eliseo no he probado tu código pero creo no va...
Me temo que no es tan simple la cosa. Porque lo que dice Fernando es dado el número en real "normalizado a horas" (por darle un nombre) obtener su expresión en formato hh:mm.
De allí que, por ejemplo:
4.25 son las 04:15
6.5 son las 06:30
17.75 son las 17:45
Es decir, donde la parte entera corresponde a las horas, mientras que la decimal a los minutos.
Tu propuesta toma literalmente el número y asume que la parte decimal es exactamente los minutos.
La otra es diseñar una función propia que extraiga cada parte y haga la conversión de la parte decimal a los minutos.
Saludos,
procedure TForm1.Button1Click(Sender: TObject); var numeroInt: integer; numeroStr: string; numero: real; begin numero := strtoFloat(edit1.Text); numeroStr := FormatFloat('00.00',Numero); numeroStr := StringReplace(numeroStr,'.',':',[rfReplaceAll]); numeroInt := strtoint( copy(numeroStr,4,2) ) * 6 div 10; numeroStr := copy(numeroStr,1,3) + format('%.*d', [2,numeroInt]); showMessage( numeroStr ); end;
Escrito 08 septiembre 2012 - 11:46
var hh, mm: integer; begin hh := Trunc(Int(TimeInDouble)); mm := Trunc(Frac(TimeInDouble) * 60); end;
Escrito 08 septiembre 2012 - 11:53
function TForm1.DoubleToTime(Time: Double): string; var hh,mm: Integer; begin hh := Trunc(Int(Time)); mm := Trunc(Frac(Time) * 60); Result := Format('%.2d:%.2d',[hh, mm]); end;
Escrito 10 septiembre 2012 - 01:06
Ummm...
Demasiado lio para tan poca cosa me parece amigo.
Digo, yo, ¿Y porqué no obtener directamente las partes en vez de hacer esos pasos?:
Yo también me encontré con este problema y decidí hacerlo de la manera tradicional, truncando y luego la parte fraccionaria multiplicando por 60
Escrito 10 septiembre 2012 - 12:44
Ni me dí cuenta de tu post anterior amigo. Publiqué si leer todos los comentarios del hilo... por las prisas.
Ummm...
Demasiado lio para tan poca cosa me parece amigo.
Digo, yo, ¿Y porqué no obtener directamente las partes en vez de hacer esos pasos?:
Lo mismo que dije yo, amigo, en el cuarto mensaje del hilo
Yo también me encontré con este problema y decidí hacerlo de la manera tradicional, truncando y luego la parte fraccionaria multiplicando por 60
Eso sí, me falto el ejemplo gráfico, pero daba por supuesto que se sabría hacer![]()
![]()
![]()
Escrito 10 septiembre 2012 - 12:48
Ni me dí cuenta de tu post anterior amigo. Publiqué si leer todos los comentarios del hilo... por las prisas.
¿Y si le vamos 50-50 al crédito por los derechos de autor?
![]()
![]()
Saludos,
Escrito 10 septiembre 2012 - 12:52
Bueno... está bien... 25% para cada uno: Seoane, Cadetill, Egostar y yo.
Ni me dí cuenta de tu post anterior amigo. Publiqué si leer todos los comentarios del hilo... por las prisas.¿Y si le vamos 50-50 al crédito por los derechos de autor?
![]()
![]()
Saludos,
Y que a mi que me cague el perro ????![]()
![]()
![]()
Saludos