SQL Server のfloat型に関する仕様を知りたい

Natsuki Harada 20 評価のポイント
2024-05-14T01:01:29.1833333+00:00

具体的には、下記の事を知りたいと考えています。

とあるデータベース上に、データ型をfloatとしたカラムを持つテーブルが存在します。そのカラムへは、小数点以下の深い情報まで持つ数値が格納されています。

Management Studioを利用し、テーブルからレコードの取得を行う場合、

「上位x行の選択」、もしくは「上記x行の編集」を指定した場合とで、得られるレコードが異なります。

例えば、「3.1500000953674316」が格納されている場合、

「上位x行の選択」を指定した場合は、値「3.15000009536743」が得られます。 一方、「上位x行の編集」を指定した場合に得られる値は、「3.1500000953674316」です。 こういった事が生じる経緯を知りたいと考えています。

なお、データベースの互換性レベルは「SQL Server 2008 (100)」の設定としています。

SQL Server
SQL Server
Microsoft リレーショナル データベース管理分析システムのファミリで、電子商取引、基幹業務、データ ウェアハウジングなどのソリューションで使用されています。
24 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. SurferOnWww 2,091 評価のポイント
    2024-05-14T05:26:23.4733333+00:00

    Sql Server Management Studio (SSMS) アプリの中で「上位x行の選択」の場合は表示する際に小数点以下の桁数が制限されているのだろうと思います。

    例えば、.NET アプリでは固定小数点書式指定子というのがあって、それで小数点以下の桁数を指定できます。

    固定小数点書式指定子 (F)

    具体例下記:

    using Microsoft.Data.SqlClient;
    
    namespace ConsoleAppSqlClient
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                var connString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TestDatabase;Integrated Security=True";
                var selectQuery = "SELECT id, Value FROM FloatTest";
    
                using (var connection = new SqlConnection(connString))
                {
                    using (var command = new SqlCommand(selectQuery, connection))
                    {
                        connection.Open();
                        using (var reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Console.WriteLine($"{reader.GetDouble(1)}, {reader.GetDouble(1):F14}");
                            }
    
                            // 結果は
                            // 3.1500000953674316, 3.15000009536743
                        }
                    }
                }
            }
        }
    }
    

    SSMS がどうしているか分かりませんが、たぶん似たような話だと思います。


    【追記】

    上の回答を理解されてないように見えますので、以下に補足を追記しておきます。

    上の回答では省いてしまいましたが(ご存じだろうと思ったので)、以下のことは理解されてますか?

    1. SQL Server の float 型の仕様は Microsoft のドキュメント「float 型と real 型 (Transact-SQL)」のとおり。これが変わることはない。
    2. SSMS は SQL Server ではなく、SQL Server に接続して管理を行うための外部ツール (アプリ)。 SQL Server 本体の float の精度とは関係ない。

    なので、今回の話、

    「上位x行の選択」、もしくは「上記x行の編集」を指定した場合とで、得られるレコードが異なります。

    は、外部アプリである SSMS が SQL Server からどのようにデータを取得して、どのように表示するかという話で (その一例を上の回答で示した)、SQL Server 本体とは何の関係もありません。

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ