Проблема двойного числа с плавающей точкой при вызове метода - PullRequest
0 голосов
/ 13 сентября 2011

Вот код для моей домашней работы. В строке 10 у меня возникла проблема с двойным преобразованием в число с плавающей запятой, и я не уверен, почему это происходит. Любые советы, пожалуйста? PS. Код не закончен.

Больше информации, это номер 29.99, который объявлен как число с плавающей запятой, но здесь, я полагаю, он находится в двойной форме.

using System;

namespace Lab_3
{
    class BookTest
    {
        static void Main(string[] args)
        {
            Book book1 = new Book();
            Book book2 = new Book("Advenced C#", "Joe", "Robertson", 29.99, "PUC Press");
        }
    }

    public class Book
    {
        string authorFirstName;
        string authorLastName;
        float price;
        string publisherName;
        string title;

        public Book()
        {
        }

        public Book(string bookTitle, string firstName, string lastName, float bookPrice, string publisher)
        {
            authorFirstName = firstName;
            authorLastName = lastName;
            price = bookPrice;
            publisherName = publisher;
            title = bookTitle;
        }

        public void display()
        {
        }

        public string getAuthorName()
        {
            return 0;
        }

        public string AuthorFirstName
        {
            get
            {
                return authorFirstName;
            }
            set
            {
                authorFirstName = value;
            }
        }
        public string AuthorLastName
        {
            get
            {
                return authorLastName;
            }
            set
            {
                authorLastName = value;
            }
        }
        public float Price
        {
            set
            {
                price = value;
            }
        }
        public string PublisherName
        {
            set
            {
                publisherName = value;
            }
        }
        public string Title
        {
            set
            {
                title = value;
            }
        }

    }
}

EDIT:

Спасибо за помощь! Проблема решена, и объяснение помогло мне кое-что прояснить.

Ответы [ 2 ]

7 голосов
/ 13 сентября 2011

Литерал 29.99 является литералом double, и не существует неявного преобразования из double в float.Опции:

  • Использовать литерал float с суффиксом f: 29,99
  • Приведение к плавающей запятой: (float) 29.99
  • Избегать использования двоичных чисел с плавающей запятойдля цен измените тип параметра на decimal, а аргумент на 29.99m.

Я бы настоятельно рекомендовал последний подход - цены (и "искусственные" значения в целом) не хорошо подходит для двоичных чисел с плавающей точкой.Люди склонны считать, что десятичные значения будут сохранены точно, что означает, что они лучше подходят для десятичных чисел с плавающей запятой.

У меня есть статьи на двоичномЧисла с плавающей запятой и десятичные числа с плавающей запятой , которые вы можете найти полезными.

Так что, для ясности, ваш конструктор будет выглядеть так (я переименовал параметры немного):

public Book(string title, string authorFirstName, string authorLastName,
            decimal price, string publisher)

и вы бы назвали это так:

Book book2 = new Book("Advenced C#", "Joe", "Robertson", 29.99m, "PUC Press");
2 голосов
/ 13 сентября 2011

Попробуйте

Book book2 = new Book("Advenced C#", "Joe", "Robertson", 29.99f, "PUC Press");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...