Число для проверки дротика-двойное или целое

#flutter #dart

Вопрос:

В dart , поскольку я новичок в использовании extension , я хочу сделать простой extension , чтобы проверить, что значение удвоено.

 extension numberExtension on num{
  bool get isInteger => (this % 1) == 0;
  bool get isDouble =>double.tryParse(this) != null;
}
 

вот isInteger правильно, но для isDouble меня получается эта ошибка:

Тип аргумента » num «не может быть назначен типу параметра «String»

Проблема this в isDouble геттере!?

Комментарии:

1. bool get isDouble => !isInteger;

Ответ №1:

Предполагая, что все, что не является целым числом, является плавающим или двойным;

Почему isDecimal бы вместо этого не реализовать что-то вроде:

 extension numberExtension on num {
  bool get isInteger => (this % 1) == 0;
  bool get isDecimal => (this % 1) != 0;
}
 

или

 extension numberExtension on num {
  bool get isInteger => this is int;
  bool get isDecimal => !(this is int);
}
 

Обратите внимание, что мы могли бы напрямую использовать « this is double » выше,
но !(this is int) проверка «» просто более совместима с изменениями,
потому что она будет работать даже в том случае, если Dart когда-либо добавит какой-либо новый num подтип.


Обновление; просмотр документов говорит нам, что:

  • Если скомпилировать в JavaScript , то реального int типа не будет, только удвоения без десятичной дроби.
  • Dart , похоже, не поддерживает 32-разрядную float версию, но имеет double по крайней мере 64-разрядную.
  • int всегда 64-разрядный (как double и ), но побитовые операторы и/или операторы сдвига усекают его до 32-разрядного (потеря данных или перцепция).

номер-зависит от конкретной платформы

Ответ №2:

Заменить double.tryParse(this) != null на this is double

Ответ №3:

Ваш оригинальный подход:

 extension numberExtension on num {
  bool get isInteger => (this % 1) == 0;
  bool get isDouble =>double.tryParse(this) != null;
}
 

не работает , потому что ваш добавочный номер включен num , как this и a num . double.tryParse ожидает анализа a String .

Почему бы вам просто не проверить, является ли объект int прямым или double прямым?

 extension numberExtension on num {
  bool get isInteger => this is int;
  bool get isDouble => this is double;
}
 

Конечно, расширение не очень полезно, так x.isDouble как оно не намного удобнее в использовании, чем x is double прямое использование, и последнее имеет то преимущество, что позволяет автоматически продвигать тип.

(Кроме того, для Dart для Интернета, где int double оба типа и поддерживаются числами JavaScript, числа могут быть представлены как int и double , но использование эвристики, такой как % 1 и double.tryParse , не поможет в этом.)