SQL Server, divisione restituisce zero

Ecco il codice che sto usando nell’esempio:

PRINT @set1 PRINT @set2 SET @weight= @set1 / @set2; PRINT @weight 

Ecco il risultato:

 47 638 0 

Vorrei sapere perché restituisce 0 anziché 0,073667712

Dichiarare set1 e set2 come float invece di numeri interi o convertirli in float come parte del calcolo:

 SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float); 

Quando si utilizzano solo numeri interi in una divisione, si otterrà una divisione intera. Quando usi (almeno uno) il doppio o il float, otterrai una divisione in virgola mobile (e la risposta che vuoi ottenere).

Così puoi

  1. dichiarare una o entrambe le variabili come float / double
  2. cast una o entrambe le variabili in float / double.

Non basta convertire il risultato della divisione intera in double: la divisione è già stata eseguita come divisione intera, quindi i numeri dietro il decimale sono già persi.

Perché è un numero intero. È necessario dichiararli come numeri in virgola mobile o decimali o eseguire il cast in tali valori nel calcolo.

Semplicemente mutiply il fondo della divisione per 1.0 (o quanti decimali vuoi)

 PRINT @set1 PRINT @set2 SET @weight= @set1 / @set2 *1.00000; PRINT @weight 

se lo dichiari come float o qualsiasi formato decimale verrà visualizzato

0

solo

Per esempio :

 declare @weight float; SET @weight= 47 / 638; PRINT @weight 

Uscita: 0

Se vuoi l’output come

,073,667712 millions

Per esempio

 declare @weight float; SET @weight= 47.000000000 / 638.000000000; PRINT @weight 

In SQL Server la divisione diretta di due interi restituisce un intero anche se il risultato dovrebbe essere il float. C’è un esempio qui sotto per farlo passare:

 --1-- declare @weird_number_float float set @weird_number_float=22/7 select @weird_number_float --2-- declare @weird_number_decimal decimal(18,10) set @weird_number_decimal=22/7 select @weird_number_decimal --3-- declare @weird_number_numeric numeric set @weird_number_numeric=22/7 select @weird_number_numeric --Right way declare @weird_number float set @weird_number=cast(22 as float)/cast(7 as float) select @weird_number 

Solo l’ultimo blocco restituirà il 3,14285714285714. Nonostante il secondo blocco definito con la giusta precisione, il risultato sarà 3.00000.