Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Decimal sin redondeo

Estas en el tema de Decimal sin redondeo en el foro de Mysql en Foros del Web. Buenas. Tengo una base tabla donde inserto entre otros campos 'importe' y 'puntos'. El importe se mete a mano desde un formulario y los puntos ...
  #1 (permalink)  
Antiguo 26/05/2009, 01:06
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Decimal sin redondeo

Buenas.

Tengo una base tabla donde inserto entre otros campos 'importe' y 'puntos'. El importe se mete a mano desde un formulario y los puntos los calcula el script dividiendo el importe entre 100.

Pues bien, el tipo de dato de 'puntos' es decimal (10,1), pero no consigo lo que quiero, que es que me deje un solo decimal, sino que me redondea. Ejemplo:

//ESTO ES LO QUE QUIERO
importe=2546
puntos=2546/100=25.4

//ESTO ES LO QUE ME HACE
puntos=25.5

Con tipo de datos float hace lo mismo. Alguna idea por favor?
__________________
Dando cabezados se aprende...
  #2 (permalink)  
Antiguo 26/05/2009, 05:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

Usa TRUNCATE(valor,decimales), recortará la representación sin redondear.
En tu caso sería
Código sql:
Ver original
  1. TRUNCATE((2546/100),1)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/05/2009, 08:10
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

Muchas gracias gnzsoloyo, pero TRUNCATE no puedo insertarlo en el php.
__________________
Dando cabezados se aprende...
  #4 (permalink)  
Antiguo 26/05/2009, 09:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

Cita:
Iniciado por aliza Ver Mensaje
Muchas gracias gnzsoloyo, pero TRUNCATE no puedo insertarlo en el php.
Lo que pones no es el TRUNCATE sino la resultante del TRUNCATE.
Me refiero a que en la sentencia SELECT donde recoges los datos, donde va el nombre del campo a leer tienes que poner ese nombre dentro de la función y ponerle un alias:
Código sql:
Ver original
  1. SELECT
  2.    TRUNCATE(campoA,1) CampoA,
  3.    TRUNCATE(campoB,1) CampoB,
  4.    TRUNCATE(campoC,1) CampoC
  5. FROM tabla;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/05/2009, 09:14
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

Sigo sin enterarme pero bueno, seguiré investigando. Gracias.
__________________
Dando cabezados se aprende...
  #6 (permalink)  
Antiguo 26/05/2009, 09:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

Cita:
Iniciado por aliza Ver Mensaje
Sigo sin enterarme pero bueno, seguiré investigando. Gracias.
Explicate mejor y postea la sentencia SQL que usas (no la operación aritmética de PHP, eso no va en este foro).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/05/2009, 09:23
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

A ver, si es un tema de este foro, porque yo pregunto desde un principio que tipo de dato necesito para mostrar un solo decimal, no que operación en php necesito para mostrarlo.

Recibo una respuesta (la tuya) que no contesta a lo que pido, pero que tiene algo de concordancia con lo que necesito. Entonces, quien tiene que explicar eres tu, no yo. Explicame que no puedo tener un tipo de dato que solo guarde un decimal, o que eso no es tema de la base de datos, si no del lenguaje que use... vamos, digo yo.

Lo siento si parezco estúpido, pero esque no necesito explicar mas lo que necesito. No tiene más. Necesito que el valor se guarde con un solo decimal sin redondear.

La sentencia sql es una sentencia INSERT que inserta en los campos variables.
__________________
Dando cabezados se aprende...
  #8 (permalink)  
Antiguo 26/05/2009, 09:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

Cita:
Iniciado por aliza Ver Mensaje
A ver, si es un tema de este foro, porque yo pregunto desde un principio que tipo de dato necesito para mostrar un solo decimal, no que operación en php necesito para mostrarlo.

Recibo una respuesta (la tuya) que no contesta a lo que pido, pero que tiene algo de concordancia con lo que necesito. Entonces, quien tiene que explicar eres tu, no yo. Explicame que no puedo tener un tipo de dato que solo guarde un decimal, o que eso no es tema de la base de datos, si no del lenguaje que use... vamos, digo yo.

Lo siento si parezco estúpido, pero esque no necesito explicar mas lo que necesito. No tiene más. Necesito que el valor se guarde con un solo decimal sin redondear.

La sentencia sql es una sentencia INSERT que inserta en los campos variables.
Postea la sentencia SQL. Será más fácil comprender el problema porque el planteo es muy general y no termino de comprender si el inconveniente está a nivel de PHP o a nivel de SQL.
La solución puede provenir de ambos.
El tema a nivel de SQL es que nunca es buena idea truncar decimales como los quieres en el almacenamiento, porque a la larga crean discrepancias en subtotales en los reportes, en especial cuando se balancean muchas sumas (que nunca puedes descartar que no se harán). En ese caso, la solución no pasa por el almacenaje, sino por la representación de esa información. de allí que necesito VER la sentencia de SQL. para aconsejarte algo que realmente te sirva A FUTURO, que es donde las bases de datos realmente importan.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 26/05/2009, 09:36
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

<?php
session_start();
// Verifica que existe la sesion:
if(!isset($_SESSION['usuario']))
die('Acceso no permitido');
$usuario=$_SESSION['usuario'];
$fechahora=date('Y-m-d');
//Configuracion de la conexion a base de datos
$bd_host = "localhost";
$bd_usuario = "usuario";
$bd_password = "usuario";
$bd_base = "programapuntos";

$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
//variables POST
$referencia=$_POST['referencia'];
$importe=$_POST['importe'];
$tarjeta=$_POST['tarjeta'];
$puntos=$importe/100;
//registra los datos
$sql="INSERT INTO facturas (referencia,importe,puntos,tarjeta,usuario,fechaho ra) VALUES ('$referencia','$importe','$puntos','$tarjeta','$u suario','$fechahora')";
mysql_query($sql,$con);
include('ccpuntos.php');
?>

Este es el código que inserta los valores.

Solo necesito guardar un decimal porque así me lo pide el que me encargó el proyecto. Y siempre se va a operar con ese solo decimal. Da igual todo lo demás. Solo necesito que guarde un decimal sin redondearlo, tal cual sale de la operación /100.

Muchas gracias.
__________________
Dando cabezados se aprende...
  #10 (permalink)  
Antiguo 26/05/2009, 09:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

No suelo poner PHP porque las reglas de este foro (Bases de Datos) no permiten poner códigos de lenguaje de programación, pero la solución es híbrida, así que allá va:
Primero tienes que definir ese campo como DECIMAL y no como FLOAT:
Código sql:
Ver original
  1. IMPORTE DECIMAL(5,1)

Ten en cuenta que el tipo DECIMAL se representa por PRECISION y ESCALA. Precisión es la cantidad de dígitos totales (5 en este caso) y la escala es la cantidad de decimales que usarán (1) por detrás de la coma.
Otra cosa que debes recordar es que la PRECISION incluye el espacio para la coma (1) y el signo, y otro para el decimal (1 en este caso), por lo que el entero posible en la definición del ejemplo tiene sólo tres dígitos.
Deberás poner, entonces, elvalor de ancho de bytes que vayas a usar.

Una vez hecho esto, debes modificar la línea del PHP para incluir el truncado del valor:
Código PHP:
Ver original
  1. $sql="INSERT INTO facturas (referencia,importe,puntos,tarjeta,usuario,fechaho ra) VALUES ('$referencia','$importe',TRUNCATE('$puntos',1),'$tarjeta','$u suario','$fechahora')";

Ahora bien, si el valor está llegando redondeado, el problema se está produciendo en PHP, en ese caso tienes que usar la función round() de PHP para controlar la precisión del número y luego que el SQL lo corte.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 26/05/2009, 09:57
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

Ahora si que me has dado una respuesta de 10 gnzsoloyo.
Muchísimas gracias, voy a probar y te digo algo.

PD: el tipo de dato siempre ha sido decimal, lo de float fue para probar.
__________________
Dando cabezados se aprende...
  #12 (permalink)  
Antiguo 26/05/2009, 10:00
Avatar de aliza  
Fecha de Ingreso: diciembre-2008
Mensajes: 156
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Decimal sin redondeo

¡¡¡¡PERFECTO!!!! Eso necesitaba.
__________________
Dando cabezados se aprende...
  #13 (permalink)  
Antiguo 26/05/2009, 10:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Decimal sin redondeo

Cita:
Iniciado por aliza Ver Mensaje
¡¡¡¡PERFECTO!!!! Eso necesitaba.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:59.