Quali altre lingue, oltre a Transact SQL, affermano che 22/7 è uguale a 3? [chiuso]

-1

Stavo usando Microsoft SQL Query Analyzer l'altro giorno e ho scritto una semplice istruzione select:

SELECT 22/7 as [PI Equiv]

Sono stato sorpreso che il risultato fosse 3, quando mi aspettavo di vedere 3.1428571. Anche se dichiari che l'output è Numeric(18,7) , ottieni comunque 3.0000000.

DECLARE @Answer Numeric(18,7)
SET @Answer = 22/7
SELECT @Answer as [PI Equiv]

RESULT = 3.0000000

Quali altre lingue restituiscono valori interi quando il dividendo e il divisore sono entrambi interi?

    
posta Michael Riley - AKA Gunny 13.09.2011 - 20:44
fonte

4 risposte

19

La maggior parte delle lingue che supportano l'aritmetica dei numeri interi ti darà 3 dal calcolo 22/7 . Ciò include, C, C ++, C #, Ada, Java, ecc. Le eccezioni sembrano essere Pascal, VB e Lisp che eseguono l'aritmetica in virgola mobile per impostazione predefinita.

Le lingue in cui hai una scrittura implicita possono darti invece un risultato in virgola mobile, anche se lo controllerei prima.

Tuttavia, è una cattiva pratica di programmazione e se intendi la divisione in virgola mobile dovresti rendere almeno uno dei valori esplicitamente a virgola mobile:

pi = 22.0 / 7;
    
risposta data 13.09.2011 - 20:57
fonte
3

Non l'hai chiesto esplicitamente, ma ho pensato di aggiungere che se non vuoi un risultato intero, fai questo:

SELECT 22/7.0 as [PI Equiv]

o

SELECT 22/cast(7 as numeric (18.2)) as [PI Equiv]

La trasmissione di una variabile di output non ha fatto nulla perché il calcolo viene eseguito prima che il valore della variabile sia impostato. La divisione in SQL deve specificare esplicitamente che uno degli elementi è un decimale se si desidera un risultato decimale. Inoltre, non si dovrebbe quasi mai fare una divisione senza un'istruzione case per assicurarsi che la possibilità di divisione per 0 venga gestita a meno che il divisore non sia un valore codificato come il 7 nel calcolo.

declare @somenumber numeric(18,2)
set @somenumber = 0
SELECT CASE where  @somenumber = 0 then null else 22/@somenumber end as [PI Equiv]
    
risposta data 13.09.2011 - 21:19
fonte
2

Nell'aritmetica dei numeri interi, il resto viene ignorato . Questo è un comportamento standard nella maggior parte dei linguaggi moderni, inizialmente incluso nei linguaggi di programmazione a causa di limitazioni hardware e vincoli prestazionali.

Per ragioni storiche e prestazionali, questo comportamento è presente nella maggior parte delle lingue / piattaforme moderne; dovrai fare di tutto per trovare una lingua che non si comporta in questo modo (esempi di eccezioni includono alcuni esperimenti con Smalltalk e relativi).

    
risposta data 13.09.2011 - 21:16
fonte
1

Python 2.x (senza l'opzione -Q new o from __future__ import division )

>>> 22/7
3

bash

$ expr 22 / 7
3

Java

class Div{
    public static void main( String[] args ) {
        int x = 22/7;
        System.out.println( "22/7=" + x );
    }
}

$ java Div
22/7=3
    
risposta data 13.09.2011 - 20:52
fonte

Leggi altre domande sui tag